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]返回的数组;
答案 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代码进行插值,这可能会导致泄漏。