Загадочный выпуск NSDictionary в Objective-C?

Я работаю над последними штрихами пользовательского патча для Quartz Composer. На данный момент у меня почти все удалено из патча, и он вылетает, сообщая мне НЕДОСТУПНЫЙ ДОСТУП, когда я пытаюсь 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 и снова регистрируется. В следующий раз я получаю ПЛОХОЙ ДОСТУП прямо перед вторым оператором NSLog.

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


person Adam    schedule 23.11.2011    source источник
comment
Как определяется lastBoutData? Есть ли @property для значения? Какие настройки имеет свойство, если оно существует (сохранение и т. д.)? Вероятно, он отсутствует или не сохраняется.   -  person ThomasW    schedule 23.11.2011
comment
Является ли lastBoutData (сохраняемым) свойством?   -  person NJones    schedule 23.11.2011
comment
Я изменил его с (readwrite,assign) на (readwrite,retain), и теперь он работает. Все мои другие ивары, которые я использую аналогичным образом, (чтение, запись, назначение) и ведут себя по-другому. Я буду читать об этом, но мне непонятно, почему я не столкнулся с этой проблемой раньше? Любые идеи по этому поводу?   -  person Adam    schedule 23.11.2011


Ответы (1)


self.lastBoutData = [NSDictionary dictionaryWithDictionary:self.inputBoutData];

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

учитывать:

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

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

person NJones    schedule 23.11.2011