2

我发现我通常直接使用 NSString ,例如:

 self.text = @"word";
 label.text = @"word";
 function(@"word");

我认为直接使用 NSString 是一种错误的方式,因为 @"word" 在使用后会有 2 的 retainCount。那正确吗?

@"" 的 retainCount 到底是什么?它是自动释放对象还是保留为 1?

更重要的是,我遇到了一些内存泄漏,如下图所示:

在此处输入图像描述

我怀疑它与直接使用 NSString 有关。

4

4 回答 4

7

本质上,NSString 字面量的保留计数是无限的。这些对象的内存由编译器在编译时保留,并且在您的应用程序运行期间永远不会被释放,无论您尝试保留或释放它们的频率如何。

这是另一个很好的例子,为什么关心保留计数是错误的。您应该只关心黄金内存管理规则:如果您拥有一个对象的所有权(使用alloc、或) new,您必须稍后释放或自动释放它。否则,你不会。copyretain

于 2012-05-30T10:25:09.933 回答
2

引用字符串编程指南

在源代码中创建字符串对象的最简单方法是使用 Objective-C 的 @"..." 构造:

NSString *temp = @"/tmp/scratch";

请注意,以这种方式创建字符串常量时,应避免使用 7 位 ASCII 字符以外的任何字符。这样的对象是在编译时创建的,并且存在于程序的整个执行过程中。编译器使此类对象常量在每个模块的基础上都是唯一的,并且它们永远不会被释放,尽管您可以像处理任何其他对象一样保留和释放它们。

于 2012-05-30T10:26:46.253 回答
1

不,直接使用 @"" 来声明一个自动释放的 NSString 是件好事。但是 NSString 以特定的方式保留,并且实际上不可能知道在运行时正在做什么。有时您可能会有奇怪的保留计数。不要担心您的 48 字节泄漏......它与您的 nsstring 无关。

于 2012-05-30T10:27:02.957 回答
1

@"word" 使用后的 retainCount 为 2。那正确吗?

不,这完美地说明了为什么考虑保留计数是一个内部实现细节是不好的。您可以将字符串文字视为可执行映像“拥有”的字符串,因此它们不会消失。您应该像对待任何其他 Objective-C 对象一样对待它们。

如果您确实偷偷看了一下字符串文字的保留计数,您会发现它被设置为一个非常大的数字(类似于 an 的最大值NSInteger)。这被视为特殊值,retain并且release它们不会改变。

字符串文字的内存在编译时作为二进制映像的一部分分配。它永远不会消失。您的内存泄漏不是因为这个。

于 2012-05-30T10:41:56.680 回答