правильное создание объекта в target-c для предотвращения утечек памяти - PullRequest
0 голосов
/ 03 сентября 2010

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

Основываясь на том, что указано в руководстве по управлению памятью Apple, следующий подход является допустимым:не вызывает утечек памяти.Причина в том, что он не использует alloc для создания массива и, следовательно, sprockets не является владельцем.Однако теперь мне интересно, что находится внутри arrayWithObjects.Потому что бывает, что в моих приложениях у меня часто есть фабрика для создания пользовательских объектов с использованием чего-то похожего на:

return [[MyObject alloc] initWithParameter:(id)params]; // possible leak

Если я хочу изменить статическим методом, например:

return [MyObject initWithParameter:(id)params];

чтоможет быть в initWithParameter для соблюдения правил памяти?А что если MyObject расширяет какой-то другой объект?Я также выясняю, что правила именования методов важны для правильного консультирования программиста, что это за правило?Также не могли бы вы указать веб-ссылку, где это объясняется (я пока не умею находить документы на веб-сайте Apple).

спасибо

Ответы [ 2 ]

1 голос
/ 03 сентября 2010

Это страница, которую вы ищете: Правила управления памятью .Все сводится к соблюдению правил владения объектом.

Если вы создаете объект с использованием alloc, то вы являетесь владельцем этого объекта и должны его освободить.Например:

NSString* str = [[NSString alloc] init]; 
//do something with your str object 
[str release];
str = nil; //don't forget to set it to nil, it's still 
           //pointing to the (now unallocated) block of memory

Если вы создаете объект с использованием фабричного метода, например:

NSString* str = [NSString stringWithString:@"blah"];

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

return [[MyObject alloc] initWithParameter:(id)params]; // possible leak
return [[[MyObject alloc] initWithParameter:(id)params] autorelease]; //now autoreleased -- no leak

Вот страница на Бассейны автоматического освобождения .Apple, скажи это лучше, чем я.

Пул автозапуска - это экземпляр NSAutoreleasePool, который «содержит» другие объекты, которые получили сообщение об автозапуске;когда пул автоматического выпуска освобождается, он отправляет сообщение об освобождении каждому из этих объектов.Объект может быть помещен в пул автоматического выпуска несколько раз и получает сообщение о выпуске каждый раз, когда он помещается в пул.Таким образом, отправка автоматического выпуска вместо выпуска объекта продлевает время жизни этого объекта, по крайней мере, до тех пор, пока сам пул не будет освобожден (объект может просуществовать дольше, если он будет сохранен в промежуточный период).правила важны, поскольку они дают четкое указание на то, возвращает ли метод объект с автоматическим освобождением.В этом примере я бы назвал метод:

[MyObject myObjectWithParameter:(id)param]

Надеюсь, это помогло.

0 голосов
/ 03 сентября 2010

Обычная практика для методов alloc и creation - возвращать сохраненный объект. Все, что начинается с init, create или имени объекта, подскажет другим программистам назначение метода.

Даже если вы создаете с помощью alloc, если целью вашего метода является передача права собственности, вы не должны освобождать объект.

...