2012-03-17 45 views
1

我想获得的txt文件中使用NSMetadataQuery我的应用程序的iCloud的文件夹中的阵列所推荐的苹果:的iCloud:获取TXT数组文件存在于OS的云X

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? – 2012-03-17 03:58:11

+0

@RobKeniger是的,我愿意。为什么?? – Daniel 2012-03-17 19:25:46

回答

3

您正在使用ARC,这意味着您需要保留对分配对象的强引用,否则它们将消失。

你是你query对象,它在手动保留/释放将意味着query对象将仍然活着,直到你发送一个releaseautorelease消息上调用alloc

然而,ARC下,编译器插入你的电话和,因为它不知道你想要的query对象留下来,它调用[query startQuery]后释放query对象。由于该对象已被释放,因此它不会发布通知。

您应该持有对query对象的强烈参考。最直接的方法是将其设置为实例变量或strong属性。

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

@interface YourObject : NSObject{} 
@property (strong) NSMetadataQuery *query; 
@end