Лучше автовыпустить или выпустить прямо после?

Можно использовать http://cargo.codehaus.org/Deploying+to+a+running+container и настроить его соответственно.

9
задан Brad Cupit 12 November 2010 в 13:40
поделиться

3 ответа

В большинстве случаев это не имеет значения. Поскольку -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 , если вы выделяете много временных объектов. Но для многих / большинства применений вы не увидите каких-либо серьезных различий между ними.

но наверняка это будет на iPhone с ограниченным объемом памяти. Таким образом, вам действительно следует использовать -release вместо -autorelease , если вы выделяете много временных объектов. Но для многих / большинства применений вы не увидите каких-либо серьезных различий между ними.

но наверняка это будет на iPhone с ограниченным объемом памяти. Таким образом, вам действительно следует использовать -release вместо -autorelease , если вы выделяете много временных объектов. Но для многих / большинства применений вы не увидите каких-либо серьезных различий между ними.

14
ответ дан 4 December 2019 в 09:14
поделиться

Я согласен с Мэттом Боллом . Позвольте мне просто добавить, что если вы обнаружите, что часто используете этот шаблон, может быть удобно написать быструю категорию:

@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];
5
ответ дан 4 December 2019 в 09:14
поделиться

Я обычно использую -release, а не -autorelease, когда это возможно. Это связано с многолетним опытом отладки и улучшения кода Objective-C других людей. Код, который везде использует автозапуск, затрудняет отладку, когда объект чрезмерно высвобождается, поскольку дополнительное высвобождение происходит далеко от неправильного кода.

Также бывает, что многие люди используют автозапуск, когда просто не понимают, как работает управление памятью какао. Изучите правила, изучите API, и вам почти никогда не понадобится автоматически выпускать объект.

Последний второстепенный момент: если вам не нужно поведение автозапуска, то использование автозапуска просто без нужды добавляет дополнительную работу вашей программе.

4
ответ дан 4 December 2019 в 09:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: