2010-09-13 69 views
1

当我们写作[Obj autorelease]时会发生什么?当我们在Autorelease池中编写[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 

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

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

1)执行完上面的语句后, 现在str已经添加到autorelease池了吗?

2)如果str加入到自动释放 池,那么如果我们 后指海峡这(释放/排水 池),就像...之前

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

然后STR的引用将可从autorelease池(因为str现在被添加到autorelease池)或str的初始内存位置....?

令人困惑...... !!任何人都可以给我清楚的想法!

+0

请勿使用br标签。使用“101010”按钮来格式化代码 – 2010-09-13 15:51:03

回答

2

1)是的,只要你发送一个对象-autorelease消息,它就会被添加到自动释放池中。

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

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

(其中,顺便说一下,可以改写这样):

NSMutableString *str = [NSMutableString string]; 

...有两个对新字符串的引用;一个在autorelease池中,第二个在你的本地变量str中。换句话说,每个都包含你的字符串对象的地址。所以这个对象并不是真的在'池'中,而是'变'出来。

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

如果你发现这个东西很混乱,获得更多见解的好方法是阅读Apple的Memory Management Guide

+1

值得一提的是:'str'不包含对象,也不包含池。 'alloc','init'和'autorelease'消息的初始链返回指向该对象的指针,它就是你放入该变量的指针。当你将'autorelease'消息发送给对象时,'autorelease'方法也将相同的指针放入池中。指针在两个地方;该对象总是只在一个地方,两个指针指向的地方。 – 2010-09-13 19:16:14