当我们编写Obj自动发布时会发生什么?
例如:
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现在是否添加到自动释放池中?
2)如果字符串被添加到自动释放池中,那么如果我们在那之后引用字符串(在释放/排出池之前),例如...
[str appendString:@" I"];
NSLog(str);
[str appendString:@" like"];
NSLog(str);
[str appendString:@" programming"];
NSLog(str);那么str的引用将从自动释放池(因为str现在被添加到自动释放池)或从str的初始内存位置获得...?
令人困惑...!!有没有人能给我一个清晰的概念!
发布于 2010-09-13 22:34:37
1)可以,当您向对象发送-autorelease消息时,该对象将被添加到自动释放池中。
2)在执行以下代码行之后...
NSMutableString *str = [[[NSMutableString alloc]initWithString:@"my"] autorelease];(顺便说一句,可以像这样重写):
NSMutableString *str = [NSMutableString string]; ...there是对新字符串的两个引用;一个在自动释放池中,另一个在本地变量str中。换句话说,每个都包含string对象的地址。因此,对象并不是真正“在”池中,而是“在”变量中。
当您向池发送-release消息时,它会将-release消息发送到它当前引用的对象。请注意,在给定周期内,可以向单个对象发送多个-autorelease消息,在这种情况下,池将向该对象发送相应数量的-release消息。
如果你觉得这些东西令人困惑,一个获得更多洞察力的好方法就是阅读苹果的Memory Management Guide。
https://stackoverflow.com/questions/3701091
复制相似问题