首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我们在Autorelease池中写入[Obj autorelease]时会发生什么?

当我们在Autorelease池中写入[Obj autorelease]时会发生什么?
EN

Stack Overflow用户
提问于 2010-09-13 21:56:11
回答 1查看 298关注 0票数 1

当我们编写Obj自动发布时会发生什么?

例如:

代码语言:javascript
复制
 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

我之所以感到困惑,是因为我读到“您可以通过发送自动释放消息将对象添加到当前的自动释放池中,以便以后释放”,所以当我写道

代码语言:javascript
复制
 NSMutableString *str = [[[NSMutableString alloc]initWithString:@"my"] autorelease];

1)执行上述语句后,str现在是否添加到自动释放池中?

2)如果字符串被添加到自动释放池中,那么如果我们在那之后引用字符串(在释放/排出池之前),例如...

代码语言:javascript
复制
 [str appendString:@" I"];
 NSLog(str);
 [str appendString:@" like"];
 NSLog(str);
 [str appendString:@" programming"];
 NSLog(str);

那么str的引用将从自动释放池(因为str现在被添加到自动释放池)或从str的初始内存位置获得...?

令人困惑...!!有没有人能给我一个清晰的概念!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-09-13 22:34:37

1)可以,当您向对象发送-autorelease消息时,该对象将被添加到自动释放池中。

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

代码语言:javascript
复制
NSMutableString *str = [[[NSMutableString alloc]initWithString:@"my"] autorelease];

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

代码语言:javascript
复制
NSMutableString *str = [NSMutableString string]; 

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

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

如果你觉得这些东西令人困惑,一个获得更多洞察力的好方法就是阅读苹果的Memory Management Guide

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3701091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档