Сохранение памяти и утечки в iOS - PullRequest
0 голосов
/ 09 сентября 2011

Это общий вопрос об утечках памяти.Допустим, у вас есть следующий код:

NSObject *object = [[NSObject alloc] init];
NSArray *array = [[NSArray arrayWithObjects:object] retain];
[object release];
[array release];

Это утечка памяти?Например, нужно ли мне перечислять все объекты в массиве и освобождать их один за другим, прежде чем освободить весь массив?Или метод dealloc NSArray освобождает все объекты внутри него, а также освобождает сам массив?

Спасибо за любую помощь!Управление памятью может быть довольно сложным.

1 Ответ

7 голосов
/ 09 сентября 2011

Вот некоторые правила:

  • всякий раз, когда вы звоните alloc, вы должны в конечном итоге позвонить release

  • для каждого retain, у вас должно быть release

Когда вы добавляете объект в массив, он вызывает retain для этого объекта.Если вы не отпустите указатель на этот объект, это будет утечка.Когда вы освобождаете массив, он будет вызывать release для всех объектов, которые он содержит, поскольку он вызывал retain ранее.

NSObject *object = [[NSObject alloc] init]; 
// object has retain count 1
NSArray *array = [[NSArray arrayWithObjects:object] retain]; 
// array is autoreleased but has a retain, so has retain count 1
// object now has retain count 2
[object release];
// object now has retain count 1
[array release];
// array is now set to autorelease, 
// once that happens, array will be sent dealloc and object will be released

Следовательно, утечки памяти нет.

...