Я являюсь новым в цели-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.
Спасибо!
Да, ваши функции действительны и возвращают объекты с использованием правильных соглашений Какао для сохранения / выпуска / автоматического выпуска / копирования.
Чтобы ответить на ваш вопрос о том, что такое цикл выполнения, в функции 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 для объекта, этот объект добавляется в этот внешний пул в цикле выполнения. Когда отправка текущего события завершается, пул опорожняется, и этим объектам, наконец, отправляются сообщения об освобождении.
Последнее замечание. Может быть несколько пулов автозапуска, которые не всегда находятся в конце цикла событий. Иногда вы можете выделить десятки тысяч объектов за одну поездку в цикле событий. Когда это произойдет, вы можете настроить дополнительные внутренние пулы автоматического выпуска в своих собственных методах, чтобы уменьшить количество автоматически выпускаемых объектов в пулах автоматического выпуска. Пулы с автоматическим выпуском могут складываться.
В этом коде нет ничего плохого . Он будет компилироваться и работать так, как вы ожидаете.
Объект NSString
, возвращенный из functionA
, по-прежнему действителен после возврата, поскольку он передается по стеку следующему парню ( functionB
), который теперь сохраняет отслеживать это.