Таинственный релиз NSDictionary в Objective-C? - PullRequest
0 голосов
/ 23 ноября 2011

Я работаю над последними штрихами пользовательского патча для Quartz Composer. На данный момент у меня почти все удалено из патча, и он выдает сообщение BAD ACCESS, когда я пытаюсь NSLog значение NSDictionary, которое представляет собой ivar, и оно отлично работало в последнем выполнении, когда я его назначил. *

Мой код выглядит так:

- (BOOL) startExecution:(id<QCPlugInContext>)context
{
   lastBoutData = [[NSDictionary alloc] init ];

   return YES;
}

- (BOOL) execute:(id<QCPlugInContext>)context atTime:(NSTimeInterval)time withArguments:(NSDictionary*)arguments
{

    NSLog(@"self.inputBoutData: %@", self.inputBoutData);
    NSLog(@"lastBoutData: %@", lastBoutData);


    // have new data, put it on the output
    self.lastBoutData = [NSDictionary dictionaryWithDictionary:self.inputBoutData];
    NSLog(@"assigned: %@", lastBoutData);

    return YES;
}

Я вижу, что журнал показывает, что все три строки NSLog работают отлично, пока self.inputBoutData не введет данные. Затем я вижу, что self.inputBoutData успешно скопирован в lastBoutData в последней строке цикла NSLog.

При следующем запуске execute: atTime: withArguments :, self.inputBoutData по-прежнему заполнен, но lastBoutData снова пусто !!! Я не вижу, как это может произойти. Затем он запускает еще один цикл, как и последний, и успешно копирует self.inputBoutData в lastBoutData и снова регистрируется. В следующий раз я получаю BAD ACCESS как раз перед вторым оператором NSLog.

Я получал некоторые сообщения об ошибках, в которых говорилось, что lastBoutData не является NSDictionary, поэтому в отчаянии я добавил [lastBoutData retain], и он не вылетает. Я не выпускаю этот ивар, поэтому я не уверен, почему я должен сохранить его. Я делаю очень похожие вещи с другими иварами во многих других патчах без проблем. Чего мне не хватать? Почему эта вещь высвобождает меня или это даже то, что происходит?

1 Ответ

5 голосов
/ 23 ноября 2011
self.lastBoutData = [NSDictionary dictionaryWithDictionary:self.inputBoutData];

dictionaryWithDictionary: возвращает автоматически выпущенный словарь.И поскольку ваша собственность не была (сохранена), ничто не удерживало ее.Таким образом, ваш предыдущий словарь лишен ссылок и утек, а ваш новый словарь не сохраняется.

рассмотрите:

[lastBoutData release];
lastBoutData = [[NSDictionary alloc] initWithDictionary:self.inputBoutData];

Или используйте свой код как есть и добавьте сохранение в свойство.

...