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 回答