首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当指针设置为零时,弧线不会释放(使用工厂方法)。

当指针设置为零时,弧线不会释放(使用工厂方法)。
EN

Stack Overflow用户
提问于 2013-02-03 14:28:34
回答 2查看 1.2K关注 0票数 2

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

代码语言:javascript
运行
复制
int main(int argc, const char * argv[])
{
    @autoreleasepool
    {
        XYZPerson *myPerson = [XYZPerson person];
        myPerson = nil;
        NSLog(@"The end.");
    }
}

方法'person‘是一种工厂方法。

我有以下代码:

代码语言:javascript
运行
复制
int main(int argc, const char * argv[])
{
    @autoreleasepool
    {
        XYZPerson *myPerson = [[XYZPerson alloc] init];
        myPerson = nil;
        NSLog(@"The end.");
    }
}

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

代码语言:javascript
运行
复制
Dealloc!
The end.

但这并不像我预料的那样:

代码语言:javascript
运行
复制
The end.
Dealloc!

我是做错了什么,还是误解了ARC的概念?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-03 21:27:07

弧形保证对象将在编译时自动计数。它进一步提出了这样的要求,即代码必须在算法上完全一致(在试图通过强制转换在void*id之间进行转换时,这表现为错误--在ARC下,您必须对这些转换中的内存管理策略进行限定)。

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

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

实际上,您可能会看到寿命的变化,这取决于代码的优化级别,以及您调用的工厂方法是否在ARC与手动保存版本MRR源文件中编译。而且,在编译器和/或运行时的不同版本中,寿命可能会发生变化。

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

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

当然,这意味着不应该dealloc方法之间有顺序依赖关系。这不应该是一个繁重的需求,因为在MRR下的dealloc方法之间拥有订单依赖关系总是一件讨厌的事情。

票数 4
EN

Stack Overflow用户

发布于 2018-09-15 22:37:29

这是因为ARC仍然尊重Cocoa内存管理命名约定。您可以将属性添加到工厂方法person+ (instancetype)person __attribute__((objc_method_family(new)));,因此+ (instancetype)person __attribute__((objc_method_family(new)));假定它返回的对象带有一个递增的保留计数,需要与相应的版本进行平衡。然后,在将变量设置为零之后,就会立即发生去分配。

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

https://stackoverflow.com/questions/14673523

复制
相关文章

相似问题

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