9

通过这个文档对类 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;
}

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

4

2 回答 2

6

在 clang 文档中找到了详细信息。

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

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

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

于 2013-09-23T22:02:29.580 回答
3

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

于 2013-09-23T18:24:52.090 回答