0

私は Objective-C で作業しており、プログラムで一貫した問題に遭遇しています。私は多数の NSTableView を持っていますが、この時点まで、numberOfRowsInTableView とそれらをコンテンツで埋める関数の 2 つの関数で常にデータを「リロード」する必要がありました。

たとえば、私の「loadData()」関数は、私の .h ファイルで宣言された配列に (Core Data を使用して) フェッチ要求を入力します。

「awakeFromNib」関数で、または物事が更新されるたびに、この loadData() 関数にアクセスするだけで済みます。ただし、必要な 2 つの NSTableView 関数の先頭に関数の呼び出しを追加しないと、プログラムがクラッシュすることがわかりました。

これは問題を引き起こし始めています。何も変更されていないときに Core Data ファイルから常にフェッチするのは非常に冗長であると私は信じています。

ここにいくつかのコードがあります:

- (int)numberOfRowsInTableView:(NSTableView *)aTableView {
[self loadData];

if ([aTableView isEqual:(invoicesListTable)])
{
    return (int)[fetchedInvoices count];
}}

[self loadData] 関数を含めないと、プログラムがクラッシュします。これは、awakeFromNib 関数に [self loadData] がある場合でも発生します。

プログラムが fetchedInvoices 配列の値を「記憶」していないのはなぜですか? .h ファイルで次のように宣言されています。NSArray *fetchedInvoices;

私の「loadData」関数は次のとおりです。

- (void)loadData {
NSError *error = nil;


// fetch all invoices
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Invoice"
                                          inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]
                                    initWithKey:@"InvoiceNumber" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];


fetchedInvoices = [managedObjectContext executeFetchRequest:fetchRequest error:&error];


if (fetchedInvoices == nil) {
    NSLog(@"ERROR");
}
[fetchRequest release];
// end of invoice fetch

どんな助けでも大歓迎です。

4

1 に答える 1

3

あなたは ARC を使用していないので-release(あなたのコードで への呼び出しが見られます)、オブジェクトが必要なだけ保持されるようにする必要があります。

特に、-executeFetchRequest:error:所有していない配列を返します。それは予測不可能な寿命を持っています。長期間保管するものなので、保管が必要です。保持している場合は、もちろん、不要になったときに解放する責任もあります。

メモリ管理を適切に行うための最善の方法 (ARC を使用しない場合) は、プロパティの-init-dealloc、およびセッターに制限することです。そのため、インスタンス変数を直接割り当てるのではなく、適切な所有権セマンティクス ( 、、または) を使用して または@synthesizeのセッターを実装し、それを使用してプロパティを設定する必要があります。fetchedInvoicesstrongretaincopy

したがって、たとえば、クラスの に次のように記述できます@interface

@property (copy) NSArray *fetchedInvoices;

そして、あなたのには、次の@implementationいずれかがあります。

@synthesize fetchedInvoices;

または、宣言に必要なセマンティクスを使用してセッターを実装します。

次に、この行の代わりに:

fetchedInvoices = [managedObjectContext executeFetchRequest:fetchRequest error:&error];

あなたはこれをするでしょう:

self.fetchedInvoices = [managedObjectContext executeFetchRequest:fetchRequest error:&error];

または、同等に、これ:

[self setFetchedInvoices:[managedObjectContext executeFetchRequest:fetchRequest error:&error]];
于 2012-05-19T09:29:33.827 に答える