将文字字符串分配给带有“=”的NSString实际上做了什么?

时间:2010-01-13 04:09:57

标签: objective-c cocoa variable-assignment string-literals reference-counting

以下行实际上做了什么?

string = @"Some text";

假设在标题中声明了“string”:

NSString *string;

“=”实际上在这里做什么?它对“字符串”的引用计数有什么作用?特别是,假设由于某种原因“字符串”没有另外分配,是否需要释放?

谢谢!

3 个答案:

答案 0 :(得分:20)

任务就是这样。 string指针基本上是一个指向内存中特定地址的标签。重新分配语句会将该标签指向内存中的另一个地址!

它不会更改引用计数或在Objective-C中执行任何操作。如果您在非垃圾收集环境中运行,则需要自己维护引用计数:

[string release];
string = [@"Some text" retain];

但是,不需要管理字符串文字,因为它们是静态分配的,永远不会被释放!因此releaseretain方法只是NOOP(即没有操作)。你可以放心地省略它们。

答案 1 :(得分:2)

  

以下行实际上做了什么?

string = @"Some text";
     

假设在标题中声明了“string”:

NSString *string;
     

“=”实际上在这里做什么?它对“字符串”的引用计数有什么作用?

string不是字符串。

事实上,

string也不是任何其他类型的Cocoa对象。

string是一个变量,您创建该变量来保存NSString的实例。赋值运算符将某些东西放入变量*中。在上面的示例中,您将创建一个文字字符串,并将其放入变量中。

由于string是一个变量,而不是Cocoa对象,因此它没有引用计数。

在某处分配对象可以在垃圾收集的代码中扩展对象的生命周期(仅在Mac上)。有关详细信息,请参阅the Memory Management Programming Guide for Cocoa

*或C数组。不要将它们与Cocoa数组混淆;它们不可互换,你不能使用赋值运算符将东西放入Cocoa集合中(不管是在Objective-C中)。

答案 2 :(得分:0)

在这种情况下使用文字时,快速创建NSString对象只是语法糖。一旦创建,该对象就像另一个一样。这里的区别在于您的字符串被编译到程序中而不是动态创建。