当我们写[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的初始内存位置.... ??
混乱...!任何人都可以给我清楚的想法!
答案 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。