1

Apple が推奨する NSMetadataQuery を使用して、アプリの iCloud フォルダーにある txt ファイルの配列を取得しようとしています。

NSMetadataQuery *query = [[NSMetadataQuery alloc] init];
[query setSearchScopes:[NSArray arrayWithObject:NSMetadataQueryUbiquitousDocumentsScope]]; 

NSPredicate *pred = [NSPredicate predicateWithFormat:@"%K ENDSWITH '.txt'", NSMetadataItemFSNameKey];
[query setPredicate:pred];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(queryDidFinishGathering:) name:NSMetadataQueryDidFinishGatheringNotification object:query];

[query startQuery];

残念ながら、 queryDidFinishGathering: は呼び出されません。私は何を間違っていますか?

ありがとう!

4

1 に答える 1

3

ARC を使用しています。つまり、割り当てたオブジェクトへの強い参照を保持する必要があります。そうしないと、それらはなくなります。

オブジェクトを呼び出しallocていますquery。これは、手動の保持/解放の下では、またはメッセージqueryを送信するまでオブジェクトが生き続けることを意味します。releaseautorelease

ただし、ARC の下では、コンパイラはこれらの呼び出しを挿入します。オブジェクトを保持する必要があることを認識していないため、呼び出し後にオブジェクトをquery解放します。オブジェクトはリリースされているため、通知は投稿されません。query[query startQuery]

代わりに、オブジェクトへの強い参照を保持する必要がありqueryます。これを行う最も簡単な方法は、インスタンス変数またはstrongプロパティにすることです。

@interface YourObject : NSObject
{
    NSMetadataQuery *query;
}
@end

また

@interface YourObject : NSObject{}
@property (strong) NSMetadataQuery *query;
@end
于 2012-03-17T23:22:57.687 に答える