gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:07:36 27 4
gpt4 key购买 nike

当我们编写 [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 现在是否已添加到自动释放池中?

2) 如果str被添加到autorelease中 池,那么如果我们在之后引用 str (在释放/排出之前 池),比如...

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

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

令人困惑...!!谁能给我一个清晰的概念吗?

最佳答案

1) 是的,每当您向对象发送 -autorelease 消息时,它就会被添加到自动释放池中。

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

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

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

NSMutableString *str = [NSMutableString string]; 

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

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

如果您发现这些内容令人困惑,获得更多见解的一个好方法是阅读 Apple 的 Memory Management Guide .

关于objective-c - 当我们在 Autorelease 池中写入 [Obj autorelease] 时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3701091/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com