gpt4 book ai didi

iphone - 自动发布在 Objective-C 中是如何工作的?

转载 作者:IT王子 更新时间:2023-10-28 23:36:58 26 4
gpt4 key购买 nike

我正在阅读 Practical Memory Management指导。

我对这段代码有点困惑:

- (void)printHello {
NSString *string;
string = [NSString stringWithFormat:@"Hello"];
NSLog(@"%@", string);
}

在我看来,字符串的引用计数将为 0。这是真的吗?

在我们调用 NSLog(string) 之前,是什么阻止了字符串被释放?

这是否等同于这个:

- (void)printHello {
NSString *string;
string = [[[NSString stringWithFormat:@"Hello"] retain] autorelease];
NSLog(@"%@", string);
}

编辑:类似地,此代码在 Practical Memory Management 中给出指导:

- (NSString *)fullName {
NSString *string = [NSString stringWithFormat:@"%@ %@", firstName, lastName];
return string;
}

返回值何时以及如何被释放?所有者是谁? fullName的调用者是否需要释放全名返回的字符串?

最佳答案

严格来说,

- (void)printHello {
NSString *string;
string = [NSString stringWithFormat:@"Hello"];
NSLog(@"%@", string);
}

不等于

- (void)printHello {
NSString *string;
string = [[[NSString stringWithFormat:@"Hello"] retain] autorelease];
NSLog(@"%@", string);
}

约定是一个方法应该自动释放它返回的任何对象。唯一的异常(exception) (AFAIK) 是构造函数,它返回一个具有 +1 保留计数的对象。由于 [NSString stringWithFormat:] 返回一个对象。在第一个片段中,stringWithFormat: 返回一个已经自动释放的对象。第二个片段,您将再次保留它,它将被释放两次(具有相同的效果,但第二个保留/自动释放对是多余的)。

好的,现在回答你的问题。本质上,每次 UIKit 调用你的代码时,它都会创建一个 NSAutoreleasePool 对象。每次你自动释放一个对象时,它都会被添加到这个池中。最后,当您的代码返回到 UIKit 时,它会调用池上的 drain 方法(即 [pool drain])并释放已添加到池中的每个对象并释放池。此外,自动释放池可以嵌套,因此如果您要创建大量自动释放对象,您可以创建自己的池并将其排空。它并不像听起来那么复杂。

我强烈建议您阅读 Autorelease Pools内存管理指南中的章节(顺便说一下,紧跟在 Practical Memory Management 章节之后)。

关于iphone - 自动发布在 Objective-C 中是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4353774/

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