0

ARC 是否曾经注入过在非 ARC 环境中通常看不到的保留和释放调用?

例如,从 getter 显式释放对象:

- (NSArray *)dummyArray {
     return [[NSArray alloc]init];
}

- (void)useDummyArray {
    NSArray * arr = [self dummyArray];
    //do something with arr
    [arr release]; //unconventional injection of release.
}

ARC 是否会像上面的代码一样生成发布语句,或者它会自动释放 [self dummyArray] 返回的数组吗?

4

1 回答 1

2

ARC的美妙之处在于你不知道,或者需要知道。但是,您可以为 ARC 静态分析器提供提示:

 -(NSArray *) dummyArray NS_RETURNS_RETAINED { // this tells ARC that this function returns a retained value that should be released by the callee
      return [[NSArray alloc] init]; 
 } 

 -(NSArray *) otherDummyArray NS_RETURNS_NOT_RETAINED { // this tells ARC that the function returns a non-retained (autoreleased) value, which should NOT be released by the callee.
      return [[NSArray alloc] init];
 }

但是,NS_RETURNS_NOT_RETAINED是默认值,只要您的函数名称不以 开头init,其中NS_RETURNS_RETAINED将成为默认值。

因此,在您的特定场景中,它几乎总是会返回一个autorelease'd 值。一个主要原因是支持使用非 ARC 代码进行插值,这可能导致泄漏。

于 2012-08-31T01:33:11.053 回答