【问题标题】:Cluster initializers with ARC使用 ARC 的集群初始化器
【发布时间】:2013-09-23 17:18:58
【问题描述】:

解析通过这个document on class clusters,NSNumber实现initWithChar:大致如下方式:

- (id)initWithChar:(char)c
{
    [self release];
    return [[__NSCharNumber alloc] initWithChar:c];
}

同样,您可以使用此模式从 Nib 初始化视图:

- (id)initWithFrame:(CGRect)frame
{
    id realSelf = [[self class] nib] instantiateWithOwner:nil options:nil][0];
    realSelf.frame = frame;
    [self release];
    return realSelf;
}

我想知道,在这些情况下,ARC 是否会管理未返回的self 的释放?它在任何地方都有记录吗?

【问题讨论】:

  • 这是“类集群”,而不是“集群类”。

标签: objective-c class-cluster


【解决方案1】:

找到详情in the clang documentation

init 隐式使用__attribute__((ns_consumes_self)) 属性,这意味着虽然self 被定义为__strong id self,但初始分配不执行保留。这意味着一旦 self 被重新分配或函数终止,self 将使用标准强规则释放。

要获得+1,有一个隐含的__attribute((ns_returns_retained)) 可以防止返回的对象在最后被释放。

在高层次上,ARC 计划在函数结束时多释放一次self 的初始值,同时保留返回值,保持其 +1 输出。

【讨论】:

  • 谢谢你,布赖恩。您能否展示一下代码的外观?
  • @Slabko 除了在initWith... 中返回一个子类的新实例之外,它实际上并没有什么意义。我在这里整理了几个类集群的例子:github.com/bnickel/Cluster-Initializer-Examples
【解决方案2】:

它属于标准 ARC 对象所有权规则,因此“未返回的 self”最终将没有任何强引用,因此当它超出范围时会自动为您释放。

【讨论】:

    猜你喜欢
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 2021-07-28
    • 2012-06-05
    • 2012-07-18
    相关资源
    最近更新 更多