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代码进行插值,这可能会导致泄漏。