首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么ARC保留方法参数?

为什么ARC保留方法参数?
EN

Stack Overflow用户
提问于 2012-04-25 14:29:44
回答 1查看 4.2K关注 0票数 20

当使用ARC编译时,方法参数通常在方法开始时被保留,在方法结束时释放。这种保留/释放对似乎是多余的,并与ARC“生成你本来会编写的代码”的想法相矛盾。在那些黑暗的、ARC之前的日子里,没有人对所有的方法参数执行额外的保留/释放,只是为了安全起见,不是吗?

考虑一下:

代码语言:javascript
复制
@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_retainobjc_release的调用。到底怎么回事?

这不是一个大问题,但在使用Instruments分析性能敏感的代码时,确实会出现这种额外的保留/释放流量。看起来你可以用__unsafe_unretained修饰方法参数来避免这种额外的保留/释放,就像我在第三个例子中所做的那样,但是这样做感觉很恶心。

EN

回答 1

Stack Overflow用户

发布于 2012-07-17 20:29:17

它不会在幕后递增。在ARC下,如果对象是强的,它将简单地保持活动状态,直到没有更多的强指针指向它。但这与对象是否作为参数传递没有任何关系。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10310441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档