直接使用NSString

时间:2012-05-30 10:21:56

标签: iphone objective-c nsstring

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

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

我认为直接使用NSString是一种错误的方法,因为@“word”在使用后会有一个retainCount为2。是吗?

@“”的retainCount究竟是什么?它是自动释放对象还是保留1?

此外,我遇到了一些内存泄漏,如下图所示:

enter image description here

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

4 个答案:

答案 0 :(得分:7)

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

这是另一个很好的例子,说明关注保留计数是错误的。您应该只关心黄金内存管理规则:如果您拥有对象的所有权(allocnewcopyretain),则必须释放或稍后再自动发布。否则,你没有。

答案 1 :(得分:2)

引自String programming guide

  

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

     

NSString * temp = @“/ tmp / scratch”;

     

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

  

@“word”在使用后的retainCount为2。是吗?

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

如果你偷偷摸摸地看一下字符串文字的保留计数,你会发现它被设置为一些非常大的数字(类似于NSInteger的最大值)。这被视为retainrelease的特殊值,它们不会更改。

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