Почему этот код вызывает сбой NSMetadataQuery? - PullRequest
0 голосов
/ 21 января 2012

Я получил очень простой проект XCode. Имеет один делегат файлового приложения со следующим содержимым

@interface TestController : NSObject <NSApplicationDelegate, NSMetadataQueryDelegate>

@property (assign) IBOutlet NSWindow *window;
@property (strong, nonatomic) NSString *text;
@property (strong, nonatomic) NSMetadataQuery *query;

@end


@implementation TestController

@synthesize window = _window;
@synthesize text = _text;
@synthesize query = _query;

- (id)init {
    self = [super init];
    if (self) {
        self.query = [[NSMetadataQuery alloc] init];
        self.query.searchScopes = [NSArray arrayWithObject:NSMetadataQueryLocalComputerScope];
        self.query.predicate = [NSPredicate predicateWithFormat:@"kMDItemTextContent LIKE[cd] %@", @"test"];
        self.query.delegate = self;
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(queryNote:)
                                                     name:nil
                                                   object:self.query];

        [self.query startQuery];
        [self addObserver:self forKeyPath:@"text" options:0 context:NULL];
    }
    return self;
}

- (void)queryNote:(NSNotification *)note {
    NSLog(@"queryNote: %@", [note name]);
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if ([keyPath isEqualToString:@"text"]) {
        NSString *str = self.text ? self.text : @"test";
        self.query.predicate = [NSPredicate predicateWithFormat:@"kMDItemTextContent LIKE[cd] %@", str];
    }
}

@end

В конструкторе интерфейсов у меня есть один контроллер массива, массив содержимого которого связан с ключом query.results тестового контроллера. У меня также есть NSSearchField, значение которого связано со строкой text. В тот момент, когда я набираю один символ в поле поиска, вся программа вылетает на EXC_BAD_ACCESS. Я сузил это и выяснил, что если я установлю self.query.predicate внутри -setText, то все будет работать нормально. Также работает упаковка self.query.predicate внутри блока GCD. Вопрос в том, почему изменение предиката NSMetadataQuery из уведомления KVO приводит к сбою программы? (Я проверил все это вызывается из основного потока кстати)

У меня есть тестовый проект на github, так что вы можете легко клонировать и проверить проблему.

https://github.com/tonyxiao/NSMetadataQueryCrash

...