【问题标题】:What's happened with retainCount in Xcode 4.2?Xcode 4.2 中的 retainCount 发生了什么?
【发布时间】:2011-12-20 16:24:21
【问题描述】:

我注意到在将我的 Xcode 更新到 4.2 后,retainCount 总是等于 -1。我没有在我的项目中使用 ARC,我什至尝试创建新项目并在项目设置中将 ARC 选项切换为关闭,但下一行的工作方式非常奇怪:

NSString *string = [[NSString alloc] init];
NSLog(@"%i", [string retainCount]);   //-1
[string retain];
[string retain];
[string retain];
NSLog(@"%i", [string retainCount]);   //still -1
[string release];
[string release];
[string release];
NSLog(@"%i", [string retainCount]);   //still -1

我错过了什么吗?我认为如果关闭 ARC 选项,项目将像以前一样工作..

【问题讨论】:

  • %d 怎么样? NSLog(@"%d, [string retainCount]);
  • 不管发生了什么,它都不是一个有用的方法,而且真的没有理由使用它。
  • @beryllium - 不,-retainCount 返回一个 NSUInteger。尝试将其格式化为浮点数会导致 LLVM 下的编译器错误,否则会导致垃圾结果。无论如何,这只是another reason not to use -retainCount。我很高兴 ARC 把它变成了编译器错误。
  • 我只是想玩一下块和 Block_copy,看看如何保留/释放它们。我尝试将编译器切换到 GCC,但即使我在 NSLog 中使用 %d 仍然得到 -1

标签: ios xcode4.2 automatic-ref-counting retaincount


【解决方案1】:

首先,让我先说如果您拨打retainCount,您可能做错了什么。这种方法应该只供编写低级框架代码的人使用,即使那样也只能在调试时使用。对象可能会在您背后被保留和自动释放,因此调用 -retainCount 非常具有误导性。

无论如何,我怀疑答案是[[NSString alloc] init] 正在返回一个单例对象。它是不可变的,并且是空的,所以当它可以返回 @"" 时,它真的没有理由为你创建一个全新的字符串。

【讨论】:

  • 解释是正确的,但我不同意retainCount:根本不应该调用它。它应该早就被删除了。
  • @SvenWeidauer:除非你在 Apple 工作,否则你可能不会编写低级框架代码。
  • 我同意你们的观点,我从未在我的产品中使用过 retainCount,但我想看看内存管理如何与块一起工作
猜你喜欢
  • 1970-01-01
  • 2014-08-29
  • 2011-09-10
  • 2020-02-17
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多