2012-03-17 5 views
1
私はAppleが推奨されているようNSMetadataQueryを使用して私のアプリのiCloudのフォルダ内のtxtファイルの配列を取得しようとしています

OS X上で、クラウドに存在するTXTファイルの配列を取得:のiCloud:

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 :決して呼ばれない。私は間違って何をしていますか?

ありがとうございます!

+1

あなたはARCを使用していますか? –

+0

@RobKenigerはい、あります。なぜ?? – Daniel

答えて

3

ARCを使用しています。これは、割り当てたオブジェクトや遠ざかるオブジェクトへの強い参照を保持する必要があることを意味します。

あなたはそれをreleaseまたはautoreleaseメッセージを送信するまで手動下queryオブジェクトが生きているままであろうことを意味する/解除を保持あなたのqueryオブジェクト、上allocを呼び出しています。

しかし、ARCの下に、コンパイラはあなたのためにこれらの呼び出しを挿入し、それはあなたの周りに固執するqueryオブジェクトを望んでいることを知らないので、あなたが[query startQuery]を呼び出した後、それはqueryオブジェクトを解放します。オブジェクトは解放されているので、通知をポストしません。

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

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

または

@interface YourObject : NSObject{} 
@property (strong) NSMetadataQuery *query; 
@end 
関連する問題