Освобождение при уведомлении - PullRequest
1 голос
/ 08 июля 2010

У меня есть объект

id currentObject;

, который я хочу пропустить через уведомление.Проблема в том, что я не знаю, как правильно выпустить его, и документация по управлению памятью сводит меня с ума.

Я делаю это сейчас так:

[[NSNotificationCenter defaultCenter] postNotificationName:@"MessageReceived" object:nil userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[currentObject copy], @"key", nil]];
[currentObject release];

Если это скореебыть:

[[NSNotificationCenter defaultCenter] postNotificationName:@"MessageReceived" object:nil userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[currentObject autorelease], @"key", nil]];

?

(это для iPhone, iOS4.0)

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 08 июля 2010

В любом случае все в порядке.Хотя между этими двумя подходами существует незначительная разница, в данном случае это не должно иметь практического значения.Пока вы тем или иным образом освобождаете свою собственность, у вас все будет хорошо.Словарь и центр уведомлений будут заниматься своими собственными проблемами в свое время.

РЕДАКТИРОВАТЬ: Упс, что-то пропустили.То, что я сказал вначале, по-прежнему применимо в целом: НО в первом примере, который вы называете copy на currentObject.Это создаст новый бит владения - который вы сразу забудете и, следовательно, вызовете утечку памяти.

Поскольку мы не видим, где вы создаете currentObject возможно обе версии перепроизводят это тоже.Но предполагая, что вы alloc это, вы достаточно отпускаете это.Но если вы настаиваете на вызове copy - возможно, в этом нет необходимости, хотя вы знаете больше о том, что такое currentObject и что может с ним произойти, - вам также нужно release создать новую копию, например, упаковавcopy вызовите autorelease, например:

[[NSNotificationCenter defaultCenter] postNotificationName:@"MessageReceived" object:nil userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[[currentObject copy] autorelease], @"key", nil]];
[currentObject release];

Если это неясно, прочитайте еще раз документы о владении объектом .

0 голосов
/ 08 июля 2010

Вы можете предположить, что объекты, которые вы передаете вашим объектам, решают их собственные проблемы владения передаваемыми объектами, если в документации не указано иное. Например, прокрутите до конца обзор NSNotificationCenter docs , и есть призыв о том, что он не удерживает наблюдателей.

Ваш первый пример протекает, потому что вы передаете копию вашего объекта в словарь, созданный с помощью -copy. Таким образом, вы владеете как объектом, так и копией, но никогда не выпускаете копию (словарь также сохраняет копию). Если вы хотите, чтобы словарь содержал копию объекта, а не сам объект, сделайте следующее:

[[NSNotificationCenter defaultCenter] 
    postNotificationName:@"MessageReceived" 
                  object:nil 
                userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[[currentObject copy] autorelease], @"key", nil]];

Второй пример подходит при условии, что вы являетесь владельцем currentObject, т.е. вы получили его с помощью new, alloc или метода, содержащего копию, или ранее сохранили его.

...