2010-04-26 2 views
2

Я видел в (Apple) пример кода два типа способов выделения памяти, и не уверен, что понимаю разницу и результирующее поведение.Управление памятью iPhone, вопрос новичков

// FAILS 
NSMutableArray *anArray = [NSMutableArray array]; 
[anArray release]; 

// WORKS 
NSMutableArray *anArray1 = [[NSMutableArray alloc] init]; 
[anArray release]; 

Под «FAILS» Я имею в виду я получаю аварии/времени выполнения предупреждений и т.д., и не всегда, как только я называю релиз ...

Любое объяснение ценится.

Благодаря

+0

возможный дубликат http://stackoverflow.com/questions/1740286/suggest-the-best-way-of-initialization-of-array-or-other- объекты –

+0

Как правило, вы должны только '[выпускать]' объекты, которые вы [alloc] 'или' [сохраняете] ' –

ответ

6

Пожалуйста, имейте в виду, что

NSMutableArray *anArray = [NSMutableArray array]; 

акты, как:

NSMutableArray *anArray1 = [[[NSMutableArray alloc] init] autorelease]; 

Так делать релиз снова вызовет сбой, как вы пытаетесь выпустить autoreleased объект.

Надеюсь, это вам поможет.

Спасибо,

Madhup

2

В первом случае вы получаете autoreleased объект, который вам не нужно освободить

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

Прочитайте эту документацию для справки: -

http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

+0

Просто отправляйте, чтобы сказать, что вам абсолютно необходимо прочитать руководство по управлению памятью Objective-C от Apple. Хотя эта ссылка немного некорректна; реальная ссылка: http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html. Нет никакого оправдания для программирования в Objective-C без прочтения этого руководства. – dancavallaro

+0

Упс, исправлена ​​ссылка. Спасибо – djhworld

1

Для уточнения на djhworlds ответ:

alloc, copy, mutableCopy и new сделает вас владельцем нового объекта, retain делает вас владелец существующего объекта, и вы несете ответственность за его использование. Другие методы возвращают объект, который был -[autoreleased], и, таким образом, вы не несёте за него никакой ответственности, но будьте осторожны: он исчезнет на следующей итерации цикла запуска (обычно), так как это обычно, когда пул авторекламы дренажи.

Практический результат этого заключается в том, что версия // FAILS отлично работает в контексте этой конкретной части кода, но как только цикл цикла катится и пул сливается, ваш объект, уже выпущенный и ушедший, заставляет вещи идти бум.

+0

Не забудьте сохранить. –

+0

'- [сохранить]'! Никогда не забуду! –

Смежные вопросы