当我们在自动释放池中编写[Obj autorelease]时会发生什么?

时间:2010-09-13 13:56:11

标签: objective-c cocoa

当我们写[Obj autorelease]时会发生什么?

例如:

 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];<br>
 NSMutableString *str = [[[NSMutableString alloc]initWithString:@""] autorelease];<br>
 NSLog(str);<br>
 [str appendString:@" I"];<br>
 NSLog(str);<br>
 [str appendString:@" like"];<br>
 NSLog(str);<br>
 [str appendString:@" programming"];<br>
 NSLog(str);<br>
 [pool drain];<br>
 NSLog(@"%@",str); //invalid

我很困惑,因为我读到“你可以通过发送一个autorelease消息将一个对象添加到当前的自动释放池以供以后发布”,所以当我写的时候

 NSMutableString *str = [[[NSMutableString alloc]initWithString:@"my"] autorelease];

1)执行上述声明后,     str现在被添加到自动释放池了吗?

2)如果将str添加到autorelease中     池,然后如果我们提到str后     那(在释放/排水之前)     游泳池),就像......

 [str appendString:@" I"];
 NSLog(str);
 [str appendString:@" like"];
 NSLog(str);
 [str appendString:@" programming"];
 NSLog(str);

然后str的引用将从autorelease池中获取(因为str现在被添加到自动释放池中)或者从str的初始内存位置.... ??

混乱...!任何人都可以给我清楚的想法!

1 个答案:

答案 0 :(得分:2)

1)是的,无论何时向对象发送-autorelease消息,都会将其添加到自动释放池中。

2)执行以下代码行后......

NSMutableString *str = [[[NSMutableString alloc]initWithString:@"my"] autorelease];

(顺便说一下,可以像这样重写):

NSMutableString *str = [NSMutableString string]; 

...有两个对新字符串的引用;一个在自动释放池中,另一个在您的本地变量str中。换句话说,每个都包含字符串对象的地址。因此,对象不是真正“在”池中,而是在“变量”中。

当您向池中发送-release消息时,它会向其当前引用的对象发送-release条消息。请注意,单个对象可以在给定周期内发送多个-autorelease消息,在这种情况下,池将向对象发送相应数量的-release消息。

如果你发现这些东西令人困惑,那么获得更多洞察力的好方法就是阅读Apple的Memory Management Guide

相关问题