Можно использовать http://cargo.codehaus.org/Deploying+to+a+running+container и настроить его соответственно.
В большинстве случаев это не имеет значения. Поскольку -autorelease
просто означает, что объект будет освобожден в конце текущей итерации цикла выполнения, объект будет освобожден в любом случае.
Наибольшее преимущество использования -autorelease
заключается в том, что вам не нужно беспокоиться о времени жизни объекта в контексте вашего метода. Итак, если позже вы решите, что хотите что-то сделать с объектом через несколько строк после последнего использования, вам не нужно беспокоиться о переносе вашего вызова на -release
.
Основной экземпляр при использовании -release
будет заметна разница по сравнению с использованием -autorelease
, если вы создаете много временных объектов в своем методе. Например, рассмотрим следующий метод:
- (void)someMethod {
NSUInteger i = 0;
while (i < 100000) {
id tempObject = [[[SomeClass alloc] init] autorelease];
// Do something with tempObject
i++;
}
}
К моменту завершения этого метода у вас будет 100 000 объектов, находящихся в пуле автозапуска, ожидающих освобождения. В зависимости от класса tempObject
, это может быть, а может и не быть серьезной проблемой на рабочем столе, но наверняка она будет на iPhone с ограниченным объемом памяти. Таким образом, вам действительно следует использовать -release
вместо -autorelease
, если вы выделяете много временных объектов. Но для многих / большинства применений вы не увидите каких-либо серьезных различий между ними.
-release
вместо -autorelease
, если вы выделяете много временных объектов. Но для многих / большинства применений вы не увидите каких-либо серьезных различий между ними. но наверняка это будет на iPhone с ограниченным объемом памяти. Таким образом, вам действительно следует использовать -release
вместо -autorelease
, если вы выделяете много временных объектов. Но для многих / большинства применений вы не увидите каких-либо серьезных различий между ними. Я согласен с Мэттом Боллом . Позвольте мне просто добавить, что если вы обнаружите, что часто используете этот шаблон, может быть удобно написать быструю категорию:
@interface UIView (MyCategories)
- (UIView *)addNewSubviewOfType:(Class)viewType inFrame:(NSRect)frame;
@end
@implementation UIView (MyCategories)
- (UIView *)addNewSubviewOfType:(Class)viewType inFrame:(NSRect)frame
{
UIView * newView = [[viewType alloc] initWithFrame:frame];
[self addSubView:newView];
return [newView autorelease];
}
@end
Которую можно использовать следующим образом:
UIView * view = [someView addNewSubviewOfType:[UIView class]
inFrame:someFrame];
И это даже работает с другими типами, если они взяты из UIView:
UIButton * button = [mainView addNewSubviewOfType:[UIButton class]
inFrame:buttonFrame];
Я обычно использую -release, а не -autorelease, когда это возможно. Это связано с многолетним опытом отладки и улучшения кода Objective-C других людей. Код, который везде использует автозапуск, затрудняет отладку, когда объект чрезмерно высвобождается, поскольку дополнительное высвобождение происходит далеко от неправильного кода.
Также бывает, что многие люди используют автозапуск, когда просто не понимают, как работает управление памятью какао. Изучите правила, изучите API, и вам почти никогда не понадобится автоматически выпускать объект.
Последний второстепенный момент: если вам не нужно поведение автозапуска, то использование автозапуска просто без нужды добавляет дополнительную работу вашей программе.