ARC是否注入了非常规代码?

时间:2012-08-31 01:24:56

标签: objective-c automatic-ref-counting

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]返回的数组;

1 个答案:

答案 0 :(得分: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代码进行插值,这可能会导致泄漏。