使用 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
在发布模式下使用 Xcode 4.3.2 编译时,程序集(以便我能够理解它)包含对第二种方法的开始objc_retain
和objc_release
结束处的调用。这是怎么回事?
这不是一个大问题,但是在使用 Instruments 分析性能敏感代码时,确实会出现这种额外的保留/释放流量。__unsafe_unretained
正如我在第三个示例中所做的那样,您似乎可以使用 来装饰方法参数以避免这种额外的保留/释放,但这样做感觉很恶心。