gpt4 book ai didi

objective-c - 当指针设置为 nil 时,ARC 不会释放分配(使用工厂方法)

转载 作者:行者123 更新时间:2023-12-03 16:28:56 27 4
gpt4 key购买 nike

编辑:此代码实际上发生了下面定义的问题:

int main(int argc, const char * argv[])
{
@autoreleasepool
{
XYZPerson *myPerson = [XYZPerson person];
myPerson = nil;
NSLog(@"The end.");
}
}

方法“person”是一个工厂方法。

<小时/>

我有以下代码:

int main(int argc, const char * argv[])
{
@autoreleasepool
{
XYZPerson *myPerson = [[XYZPerson alloc] init];
myPerson = nil;
NSLog(@"The end.");
}
}

XYZPerson 重写 dealloc 方法,以便它使用 NSLog 打印出一些内容。我希望上面的代码输出如下内容:

Dealloc!
The end.

但是事情并不像我想象的那样:

The end.
Dealloc!

我做错了什么或者我误解了ARC的概念吗?

最佳答案

ARC保证对象在编译时自动进行引用计数。它更进一步,要求代码在算法上完全一致(这在尝试通过转换在 void*id 之间转换时表现为错误 - 在ARC,您必须跨此类强制转换限定内存管理策略)。

ARC 不是垃圾收集器;没有扫描,没有线程,也没有停止世界的行为。这意味着行为更加可预测,但代价是自动周期检测等。

虽然 ARC 保证对象的生命周期将被自动管理,但 ARC 不保证生命周期超出“对象的生命周期至少与代码中使用的时间一样长,也许更长”。

事实上,您可能会看到生命周期发生变化,具体取决于代码的优化级别以及您调用的工厂方法是否在 ARC 与手动保留释放 [MRR] 源文件中编译。并且生命周期可能会随着编译器和/或运行时版本的不同而变化。

例如,调用工厂方法的 ARC 代码有时会使 autorelease 完全短路。

听起来很可怕,但这并不是因为算法一致性要求。由于不能存在模棱两可的行为(就像普通的旧式 MRR 中可能存在的那样),因此生命周期可能会随版本而变化不应该影响您的代码。

当然,这意味着您不应该dealloc 方法之间具有顺序依赖性。这不应该是一个繁重的要求,因为在 MRR 下的 dealloc 方法之间具有顺序依赖性总是一件令人讨厌的事情。

关于objective-c - 当指针设置为 nil 时,ARC 不会释放分配(使用工厂方法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14673523/

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