当使用ARC编译时,方法参数通常在方法开始时被保留,在方法结束时释放。这种保留/释放对似乎是多余的,并与ARC“生成你本来会编写的代码”的想法相矛盾。在那些黑暗的、ARC之前的日子里,没有人对所有的方法参数执行额外的保留/释放,只是为了安全起见,不是吗?
考虑一下:
@interface Test : NSObject
@end
@implementation Test
- (void)testARC:(NSString *)s
{
[s length]; // no extra retain/release here.
}
- (void)testARC2:(NSString *)s
{
// ARC inserts [s retain]
[s length];
[s length];
// ARC inserts [s release]
}
- (void)testARC3:(__unsafe_unretained NSString *)s
{
// no retain -- we used __unsafe_unretained
[s length];
[s length];
// no release -- we used __unsafe_unretained
}
@end
当在发布模式下使用Xcode4.3.2进行编译时,程序集(这样我就能够理解它)在第二个方法的开始和结束处包含对objc_retain
和objc_release
的调用。到底怎么回事?
这不是一个大问题,但在使用Instruments分析性能敏感的代码时,确实会出现这种额外的保留/释放流量。看起来你可以用__unsafe_unretained
修饰方法参数来避免这种额外的保留/释放,就像我在第三个例子中所做的那样,但是这样做感觉很恶心。
发布于 2012-07-17 20:29:17
它不会在幕后递增。在ARC下,如果对象是强的,它将简单地保持活动状态,直到没有更多的强指针指向它。但这与对象是否作为参数传递没有任何关系。
https://stackoverflow.com/questions/10310441
复制相似问题