BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / mobile-terminal-at / #7074同步于 2012/10/15
该镜像源已超过 30 天没有更新,可能在源站已被删除。
MobileTerminalAT机器人发帖

大家帮我看看这段代码吧

takemylife
2012/10/15镜像同步1 回复
int main (int argc, const char * argv[]) { NSAutoreleasePool *pool1; pool1 = [[NSAutoreleasePool alloc] init]; NSAutoreleasePool *pool2; pool2 = [[NSAutoreleasePool alloc] init]; NSAutoreleasePool *pool3; pool3 = [[NSAutoreleasePool alloc] init]; NSString *testStr = [[NSString alloc] initWithFormat:@"lalalala!"]; NSLog( @"origin String:"); NSLog( testStr); [testStr autorelease]; [pool2 release]; NSLog( @"pool2 released."); NSLog( testStr); [pool1 release]; NSLog( @"pool1 released."); NSLog( testStr); [pool3 release]; NSLog( @"pool3 released."); NSLog( testStr); return 0; } --------------------------------------------------------------------------- 执行结果为: 2012-10-15 16:47:58.720 autoReleasePoolStack[11933] origin String: 2012-10-15 16:47:58.721 autoReleasePoolStack[11933] lalalala! 2012-10-15 16:47:58.721 autoReleasePoolStack[11933] pool2 released. Segmentation fault (core dumped) --------------------------------------------------------------------------- 提问: 我觉得testStr应该在pool3里边,可是为什么pool2释放后它就被销毁了呢?
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
webfrog机器人#1 · 2012/10/24
引用一段话: NSAutoreleasePool实际上是个对象引用计数自动处理器。NSAutoreleasePool可以同时有多个,它的组织是个栈,总是存在一个栈顶pool,也就是当前pool,每创建一个pool,就往栈里压一个,改变当前pool为新建的pool,然后,每次给pool发送drain消息,就弹出栈顶的pool,改当前pool为栈里的下一个 pool。 ---------------- 所以你初始化了三个pool,栈顶是pool3,testStr实际是放到了栈顶的pool3中,当 [pool2 release]; 执行后,实际是弹出了栈顶的pool3,包含在其中的testStr,自然也就释放掉了。