Подтвердить что ты не робот

Управление памятью NSMutableArray

NSMutableArray *a1 = [[NSMutableArray alloc] init];
NSMutableArray *a2 = [NSMutableArray array];

TempObj *obj = [[TempObj alloc] init]; //assume this line is repeated for each obj
[a1 addObject:obj];
[a1 addObject:obj2];
[a1 addObject:obj3];
[a1 addObject:obj4];

[obj release];
[obj2 release];
[obj3 release];
[obj4 release];

[a1 release];

Хорошо, поэтому a2 - это autorelease obj, поэтому мне не нужно вызывать выпуск на нем? Также, как вы знаете, когда вы получаете объект автообновления?

А для a1 мне не нужно перебирать массив и сначала выпускать каждый объект? Что делать, если я назвал [a1 removeAllObjects]; это вызывает [[a1 objectAtIndex: #] release];

Я должен освободить эти объекты после того, как ive добавила их в массив?

4b9b3361

Ответ 1

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

Что касается autorelease vs release, единственный способ узнать наверняка (кроме, возможно, чтения документации) - это имя метода. Я считаю, что правило в целом состоит в том, что если вы не выделили объект, то вы не отвечаете за его освобождение.

Что касается методов создания объектов, все удобные методы (array:, arrayWithObjects:, arrayWithArray: и т.д.) возвращают автореализованные объекты. Однако их соответствующие методы init (init:, initWithObjects:, initWithArray: и т.д.) Не являются - если вы их вызываете, вы несете ответственность за вызов release в возвращаемом объекте.

Кажется, я вспоминаю еще несколько вопросов по этой теме здесь - вы можете попытаться найти более подробное объяснение.

Ответ 2

Легче думать о Objective-C управлении памятью как о собственности, а не о терминах сохранения-выпуска. Когда вы добавляете объекты в массив, массив теперь является совладельцем объекта и отвечает за правильное управление памятью. Когда владелец (любой объект содержит отправленный вами код) вызывает release на объектах, он отказывается от права собственности, и теперь массив является единственным владельцем.

У Apple есть хороший пример того, как собственность работает в Cocoa (включая то, как вы знаете, когда вы отвечаете за вызов release объекта): Руководство по программированию управления памятью для Cocoa. Это необходимо прочитать, если вы хотите использовать Cocoa.

Ответ 3

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

В вашем примере a1 имел вызов "init" , поэтому вам нужно иметь "релиз" где-то на нем. То же самое с "obj". Вы не вызывали "init" , "сохраняете" или "копируете" на что-либо еще, поэтому вам не нужно называть "release" или "авторекламу" на что-либо еще.

Ответ 4

Я не знаю ни прав, ни прав.

NSMutableArray *a1 = [[NSMutableArray alloc] init]; // will be autorelease
NSMutableArray *a1 = [NSMutableArray alloc]; // will not autorelease

после [a1 removeAllObjects];

Ответ 5

Вы освободили obj, obj2, obj3, obj4 сразу после добавления их в массив (лучший способ). В противном случае вам придется зацикливать и отпускать каждый объект (что глупо: тот, который я сделал до сих пор).