2012-06-19 1 views
1

Извините, что задал совершенно основной вопрос, но если у меня есть синтезированное свойство, которое сохраняется.Alloc новый объект C объект для сохранения свойства?

self.myProperty = [[NSObject alloc] init]; 

приведет к утечке памяти?

Так я правильно в мысли, что мне нужно сделать

self.myProperty = [[NSObject alloc] init]; 
[self.myProperty release]; 

для того, чтобы сбалансировать? Потому что это кажется глупым.

ответ

2

Стандартная практика заключается в использовании autorelease в этой ситуации. Итак:

self.myProperty = [[[NSObject alloc] init] autorelease]; 

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

Отредактировано для добавления: @walkytalky делает хороший момент в комментариях, что на самом деле это alloc, который сохраняет этот объект, init просто возвращает его.

+0

Обратите внимание, что концептуально сохранение происходит из 'alloc'. Конечно, поскольку 'init' впоследствии возвращает объект, вы говорите также правду. И действительно, могут быть случаи, когда 'init' возвращает * другой * сохраненный объект, но, тем не менее, традиция связывает сохранение с распределением, а не инициализацией (как в старом правиле NARC). – walkytalky

0

С включенным ARC, xcode будет обрабатывать управление памятью. Если вы не используете ARC, обязательно отпустите его в методе dealloc.

+0

Так что мне не нужно выпускать после выделения, я полагаю. Благодарю. – wbarksdale

+1

Вы должны выпустить его в dealloc, а не dealloc. Как правило, вы никогда не должны вызывать dealloc самостоятельно, причем заметным исключением является '[super dealloc]', когда вы в настоящее время освобождаете что-то. – vcsjones

+0

Если вы выполняете ручную управление памятью, вы обычно удаляете все объекты в методе dealloc. Есть некоторые документы Apple, которые я действительно рекомендую !! Особенно «передача права собственности» - это то, что вы должны знать. – guitarflow

0

Here is a thread что вы найдете полезным.

Вы правы. Без ARC любое свойство, которое сохраняется, также должно быть выпущено.

Вы также можете сделать:

self.myProperty = nil; 

От docs:

сохраняют

Указывает, сохраняющие следует ссылаться на объект при задания.

Предыдущее значение отправляется сообщение о выпуске.

+0

'self.myProperty = nil' не решает проблему - это отменит только сохранение, выполненное самим свойством, оставив одно из' alloc' болтаться без возможности его выпуска. – walkytalky

+0

@walkytalky, когда вы называете себя.myProperty = nil, [myProperty release] вызывается из синтезированного сеттера, так почему бы это оставить что-нибудь лишнее vangling против вызова [myProperty release]? –

+0

Перечитайте вопрос. Проблема заключается в несбалансированном залоге владения, предоставляемом 'alloc'. Вызов '[myProperty release]' релизы *, который *, без сброса значения свойства. Затем правильная семантика собственности. – walkytalky

0

Другой (более подробно) метод сделать:

NSObject *o = [[NSObject alloc] init]; //retain count 1 
self.myProperty = o;     //retain count 2 
[o release];       //retain count 1 

Лично хотя, я бы, наверное, просто использовать autorelease, как и в первом примере выше.