Нужно ли автоматически высвобождать объект перед отправкой в ​​NotificationCenter в качестве пользовательских данных? - PullRequest
4 голосов
/ 04 июня 2009

Мне нужно опубликовать уведомление, используя метод postNotificationName:object:userInfo:, и я передаю пользовательский класс FileItem как userInfo, чтобы я мог получить его на другом конце. Должен ли я использовать autorelease, как это

FileItem *item = [[[FileItem alloc] init] autorelease];
[[NSNotificationCenter defaultCenter] postNotificationName:@"dataReceived" object:self userInfo:item];
[item release];

или я могу просто alloc и затем release объект сразу после передачи его в центр уведомлений по умолчанию?

FileItem *item = [[FileItem alloc] init];
[[NSNotificationCenter defaultCenter] postNotificationName:@"dataReceived" object:self userInfo:item];
[item release];

Я пытаюсь получить соглашение здесь, поскольку я предполагаю, что всякий раз, когда я передаю объект в качестве параметра в сообщении другому объекту, принимающий объект будет сохранять, если это необходимо, и что я могу безопасно освободить указанный параметр

Ответы [ 2 ]

3 голосов
/ 04 июня 2009

Второй вариант правильный. Вы также можете просто сделать следующее:

FileItem *item = [[[FileItem alloc] init] autorelease];
[[NSNotificationCenter defaultCenter] postNotificationName:@"dataReceived" object:self userInfo:item];

Общепринято, что для каждого alloc, copy или retain вам требуется соответствующий release (или autorelease). Выполнение чего-либо еще почти гарантированно приведет к тому, что ваш объект будет перевыпущен.

2 голосов
/ 04 июня 2009

autorelease просто означает «отправить release на это позже». Отправка autorelease, а затем release к тому же объекту освобождает его дважды. Как говорит Мэтт Болл, ваш последний пример и его пример эквивалентны.

Более того, вы отпускаете только то, что имеете. Как только вы отпустите его, вы перестанете владеть им и должны считать его больше не вашим. В первом примере после первого выпуска вы перестали владеть этим объектом. Тогда вторая версия явно ошибочна, потому что она освобождает объект, который вам не принадлежит.

И никогда не освобождают объект, которым владеет какой-либо другой объект, если только вы не владеете им.

...