1

У меня есть объектотпускании При информировании

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)

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

ответ

1

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

EDIT: Ой, пропустил что-то. Сначала я сказал, что в целом, НО в первом примере вы звоните copy по телефону currentObject. Это создает новый бит собственности - который вы сразу забудьте и, следовательно, произведите утечку памяти.

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

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

Если это неясно, есть еще один хороший читать о object ownership docs.

0

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

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

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

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