Когда автовыпущенным является объект, на самом деле выпущенный?

Я являюсь новым в цели-c, и я пытаюсь понять управление памятью для разбираний в ней.

После чтения превосходного
Руководство по программированию управления памятью для Какао яблоком, которое - мое единственное беспокойство, когда на самом деле автовыпущенный объект выпущен в приложении iphone/ipod. Мое понимание в конце цикла выполнения. Но что определяет цикл выполнения в приложении?

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

@implementation Test

- (NSString *) functionA {
    NSString *stringA;
    stringA = [[[NSString alloc] initWithString:@"Hello"] autorelease]
    return stringA;
}

- (NSString *) functionB {
    NSString *stringB;
    stringB = [self functionA];
    return stringB;
}

- (NSString *) functionC {
    NSString *stringC;
    stringC = [self functionB];
    return stringC;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    NSString* p = [self functionC];
    NSLog(@"string is %@",p);
}

@end

Действительно ли этот код действителен?

Из текста яблока я понимаю, что NSString, возвращенный из functionA, допустим в пределах functionB. Я не уверен, допустимо ли это в functionC и в viewDidLoad.

Спасибо!

16
задан dandan78 11 November 2011 в 14:43
поделиться

2 ответа

Да, ваши функции действительны и возвращают объекты с использованием правильных соглашений Какао для сохранения / выпуска / автоматического выпуска / копирования.

Чтобы ответить на ваш вопрос о том, что такое цикл выполнения, в функции main () вашего приложения он вызывает UIApplicationMain (). Вы можете представить, что UIApplicationMain выглядит примерно так:

void int UIApplicationMain (int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName) {
    UIApplication *app = /* create app using principalClassName */;
    [app setDelegate:/* create delegate using delegateClassName */];
    while (![app shouldTerminate]) {
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
        event = [app getNextEvent];
        [app dispatchEvent:event];
        [pool drain];
    }
}

Циклы while похожи на то, что на самом деле делает UIKit, и каждое прохождение этого цикла while похоже на прохождение цикла выполнения, где функция getNextEvent блокируется в ожидании какого-либо события для случаться. Все ваши методы обычно вызываются из чего-то вроде dispatchEvent :. Вы можете попробовать установить точку останова в одном из ваших методов, например в IBAction, и посмотреть в стеке вызовов отладчика вверху, чтобы увидеть имена методов UIKit, которые обрабатывают события и цикл выполнения. Поскольку каждый из ваших методов вызывается из этого цикла while, каждый раз, когда вы вызываете autorelease для объекта, этот объект добавляется в этот внешний пул в цикле выполнения. Когда отправка текущего события завершается, пул опорожняется, и этим объектам, наконец, отправляются сообщения об освобождении.

Последнее замечание. Может быть несколько пулов автозапуска, которые не всегда находятся в конце цикла событий. Иногда вы можете выделить десятки тысяч объектов за одну поездку в цикле событий. Когда это произойдет, вы можете настроить дополнительные внутренние пулы автоматического выпуска в своих собственных методах, чтобы уменьшить количество автоматически выпускаемых объектов в пулах автоматического выпуска. Пулы с автоматическим выпуском могут складываться.

17
ответ дан 30 November 2019 в 22:37
поделиться

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

Объект NSString , возвращенный из functionA , по-прежнему действителен после возврата, поскольку он передается по стеку следующему парню ( functionB ), который теперь сохраняет отслеживать это.

0
ответ дан 30 November 2019 в 22:37
поделиться