1

次のコードでは:

- (NSMutableArray *) fetchNotesForGroup: (NSString *)groupName {

 // Variables declaration
 NSMutableArray *result;
 NSFetchRequest *fetchRequest;
 NSEntityDescription *entity;
 NSSortDescriptor *sortDescriptor;
 NSPredicate *searchPredicate;
 NSError *error = nil;

 // Creates the fetchRequest and executes it
 fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
entity = [NSEntityDescription entityForName:@"Note" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"noteName" ascending:YES] autorelease];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[fetchRequest setReturnsDistinctResults:YES];
searchPredicate = [NSPredicate predicateWithFormat:@"categoryName like %@", groupName];
[fetchRequest setPredicate:searchPredicate];
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObject:@"noteName"]];
result = [[managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy];

 // Variables release

 return result;
}

...指定されたcategoryNameのメモを取得します。Instrumentsを実行しているとき、NSCFStringがリークしていると表示されます。

リークはiPhone開発者にとって意味があることは知っていますが、これをプラグインする方法がわかりません。

手がかりはありますか?すべての助けを歓迎します。

どうもありがとう!

4

3 に答える 3

1

あなたの問題はこれです:

result = [[managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy];
// Variables release
return result;

mutableCopy所有する参照(つまり、保持カウントが+1のオブジェクト)を返します。これは、(自動)解放を担当します。そうしないと、参照を放棄します。これは、アレイがリークしたことを意味します。

return [result autorelease];代わりに使用してください。

于 2010-04-20T13:51:43.873 に答える
0

まず第一に、楽器は常に正確であるとは限りません。
オブジェクトを他の場所で実際にリリースしていることがわからないという理由だけで、特別な場合のリークを報告できます。

CFの一部に漏れがある可能性もあります。

私があなたのコードで見ることができるのは、あなたが自動解放されたオブジェクトを使用しているということです。
あなたは一時的なオブジェクトであり、ライフサイクルが長くなります。
メソッドが返される直前に、代わりに明示的にリリースした場合、何が追加されますか?

また、オブジェクトのコピーを返します。
ある時点でオブジェクトが解放されていることを確認する必要があります。
自動解放されたオブジェクトを返し、呼び出し元のメソッドにオブジェクトを保持するかどうかを決定させる方がはるかに良い場合があります。

于 2010-04-20T12:38:53.493 に答える
0

文字列を作成しないため、リークしている文字列は、フェッチ要求内で終了する文字列の1つである可能性が高く、実際にリークしているのはフェッチ要求である可能性があります。(Instrumentsに表示されるコールスタックはこれを確認する必要があります。)

私はあなたが実際のリークを持っているとは思わないが、これを行うことによって:

 fetchRequest = [[[NSFetchRequest alloc] init] autorelease];

... fetchRequestが定義された範囲を超えて存続することを許可している場合、Instrumentsはそれをリークとして解釈します。

自動解放は、外部の自動解放プールが空になるまでオブジェクトをぶらぶらさせるため、実際にはオブジェクトを直接解放よりも長く存続させます。たとえば、object-A内にobject-Bを作成し、それをobject-Cに自動解放すると、object-Cが保持しなくても、object-Aが割り当て解除された後もobject-Bは存続します。(ただし、最終的には予測できない瞬間に消滅します。)

自動解放は、を保持するための便利な方法ではありません。これには、他のオブジェクト間で受け渡されるオブジェクトを保持するという特定の目的があります。これを行わない場合は、自動リリースを使用しないでください。

これを行う場合:

fetchRequest = [[NSFetchRequest alloc] init];
// ...
[fetchRequest release];

...あなたのリークはなくなります。

ただし、これを実行することをお勧めします。

return [result autorelease];

...結果の配列が、別のオブジェクトによって保持されるのに十分な長さであることを確認します。

于 2010-04-20T12:41:13.797 に答える