什么时候自动释放对象被释放?
我在Objective-C中是新手,我试图理解内存管理以使其正确。
看完优秀后
Cocoa的内存管理编程指南由苹果我唯一担心的是实际上一个自动释放的对象在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
这段代码是否有效?
从Apple文本据我所知,从NSString的返回泛函在functionB的范围内有效。 我不确定它是否在functionC和viewDidLoad中有效。
谢谢!
是的,你的函数是有效的,并且使用正确的Cocoa约定返回对象来保留/释放/自动释放/复制。
要在应用程序的main()函数中回答有关runloop的问题,请调用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循环就像是通过runloop的行程,函数getNextEvent阻止等待事件发生。 所有的方法通常都是从dispatchEvent之类的东西中调用的。 您可以尝试在其中一个方法中设置断点,如IBAction,并在顶部查看调试器调用堆栈以查看处理事件和runloop的UIKit方法的名称。 由于您的每个方法都是在while循环中调用的,因此每次在对象上调用autorelease时,都会将该对象添加到运行循环中的outter池中。 当前事件完成调度时,池被耗尽,并且这些对象最终被发送释放消息。
最后一个音符。 可以有多个autorelease池,并不总是在事件循环结束时。 有时你可能会在事件循环中一次分配数以万计的对象。 发生这种情况时,您可以在自己的方法中设置其他内部自动释放池,以将autorelease对象的数量保持在autorelease池中。 自动释放池可以堆叠。
该代码没有任何问题。 它将按照您的预期进行编译和运行。
从functionA
返回的NSString
对象在返回时仍然有效,因为它正沿着堆栈传递给正在跟踪它的下一个人( functionB
)。