【发布时间】:2012-06-21 04:34:28
【问题描述】:
我正在阅读与 ARC 相关的文章。以下是该部分:
ARC 还利用了 Objective-C 语言命名约定和 推断返回对象的所有权。在 Objective-C 中,一个方法 具有以下任一前缀的统计信息
- 分配,
- 复制,
- 可变复制
- 和新的
被认为是转让所有权 返回对象给调用者。这意味着,在您的应用程序中,当 你创建一个方法,ARC会自动推断是否返回一个 autoreleased 对象或方法名称中的 +1 保留对象。但是,有一个小警告。假设您有一个 以“copy”开头的方法,如
-(NSString*) copyRightString;
ARC 假设它会将返回的字符串的所有权转移给调用者并插入一个释放 自动地。如果调用的方法和 调用方法是使用 ARC 编译的。
但是如果你的 “copyRightString” 方法位于第三方库中 使用 ARC 编译,您将过度释放返回的字符串。这是 因为,在调用代码上,ARC 编译器会插入一个发布到 平衡“复制”方法增加的保留计数。
相反,如果第三方库是使用 ARC 编译的,而您的 方法不是,你会有内存泄漏。
现在我有两个问题: 1.为什么“copyRightString”方法在非ARC编译的第三方库中时会过度释放对象?由于方法名以copy开头,所以方法不会释放对象,因为它是调用方法的责任释放 ARC 将处理的对象,因为方法的名称以 copy 开头。
2.第三方库用ARC编译为什么会出现内存泄漏? 方法不是吗?由于方法名以copy开头,所以ARC不会释放它,它是调用方法来释放它的责任。在我们的代码中,我们将释放它,因为方法名以copy开头。
我希望我清楚!
【问题讨论】:
-
是的,当然可以。但是你能回答我的问题吗?
-
除非你彻底改进它,否则没人会:)
-
如果我得到要求的答案,那么我肯定会接受它。现在如果我得到要求的答案,我会接受它。
-
希望现在有人回答。
标签: iphone objective-c automatic-ref-counting