ARC的集群初始化程序

时间:2013-09-23 17:18:59

标签: objective-c class-cluster

以下列方式解析此document on class clustersNSNumber实施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的释放?是否记录在任何地方?

2 个答案:

答案 0 :(得分:6)

找到详细信息in the clang documentation

init隐式使用__attribute__((ns_consumes_self))属性,这意味着虽然self定义为__strong id self,但初始分配不会执行保留。这意味着只要重新分配self或函数终止,self就会使用标准的强规则发布。

要获得+1输出,会有一个隐式__attribute((ns_returns_retained)),它会阻止返回的对象在最后被释放。

在较高级别,ARC计划在函数结束时释放self一个额外时间的初始值,同时保留返回值,保持其+1输出。

答案 1 :(得分:3)

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