Установка свойства для вновь выделенного объекта с использованием метода доступа вызывает утечку памяти - PullRequest
2 голосов
/ 17 мая 2011

Мне просто нужно подтверждение того, вызывает ли утечка памяти следующее:

.h файл

@property (nonatomic, retain) MyObject *foo;

.m файл

@synthesize foo;
...

self.foo = [[MyObject alloc] init];

dealloc настроен как

[foo release];

Насколько я понимаю, реализация автоматически сгенерированного метода доступа выглядит так:

-(void)setFoo:(MyObject *)newObject {
    if (foo != newObject) {
        [foo release];
        foo = [newObject retain];
    }
}

Прогулка по self.foo = [[MyObject alloc] init]; теперь читается как "распределенная"новый объект MyObject, чей счет будет равен 1, передайте его setFoo:, foo никогда не будет равен myObject, так как он был недавно выделен, поэтому освободите старое значение, увеличьте счет сохранения newObject, сделав его 2 и назначить его для foo "

dealloc освобождает foo, поэтому устанавливает для его счетчика хранения значение 1 , что означает, что этот объект просочился?

Чтобы сделать это безопасно, мы должнынапишите наш код как

self.foo = [[[MyObject alloc] init] autorelease];

Правильно ли мое понимание?

РЕДАКТИРОВАТЬ

Я понимаю, что этот вопрос не совсем подходит для SO, поэтому чувствуюможете указать мне лучшее место, чтобы задать этот тип вопросова также.

Ответы [ 3 ]

5 голосов
/ 17 мая 2011

Да, это абсолютно правильно.

3 голосов
/ 17 мая 2011

И еще один общий шаблон:

MyObject *newFoo = [[MyObject alloc] init];
self.foo = newFoo;
[newFoo release];
3 голосов
/ 17 мая 2011

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

foo=[[MyObject alloc] init];

То, что вы выбираете, может зависеть от стиля кодирования. Если вы пытаетесь освоить использование self.foo, то обязательно используйте ваш метод для согласованности и исправления ошибок. Если вам удобно использовать точечный синтаксис, используйте последний.

...