ARC是否注入过非常规代码



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

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];
 }

但是,只要函数名称不以init开头,NS_RETURNS_NOT_RETAINED就是默认值,其中NS_RETURNS_RETAINED就是默认值。

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

最新更新