Управление памятью iPhone, вопрос новичка - PullRequest
2 голосов
/ 26 апреля 2010

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

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

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

Под "Сбой" я имею в виду, что я получаю предупреждения о сбоях / времени выполнения и т. Д., И не всегда, как только я вызываю релиз ...

Любое объяснение приветствуется.

Спасибо

Ответы [ 3 ]

6 голосов
/ 26 апреля 2010

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

NSMutableArray *anArray = [NSMutableArray array];

действует как:

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

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

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

Спасибо

Madhup

2 голосов
/ 26 апреля 2010

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

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

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

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

1 голос
/ 26 апреля 2010

Чтобы уточнить ответ djhworlds:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...