将字面字符串赋值给NSString使用"="号实际上是做什么?

8
以下这行代码实际上是做什么的?
string = @"Some text";

假设“string”在头文件中这样声明:
NSString *string;

在这里,"="实际上是做什么的?它对"string"的引用计数有什么影响吗?特别是,假设由于某种原因没有将"string"分配给其他变量,那么它是否需要被释放?

谢谢!

3个回答

20

这个赋值语句只是简单地改变了指向内存中特定地址的标签,也就是 string 指针。重新赋值会将该标签指向内存中的另一个地址。

在 Objective-C 中,它不会改变引用计数或执行任何其他操作。如果你在非垃圾回收环境下运行程序,你需要手动维护引用计数:

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

然而,字符串字面值不需要被管理,因为它们被静态分配并永远不会被释放!因此,releaseretain方法只是NOOP(即无操作)。您可以安全地省略它们。


谢谢!这正是我对指针赋值的预期...啊,所以在赋值后的"-1"保留计数(即[string retainCount])是一个标志,表示"string"指向一个字符串字面量,因此不需要进行管理,可以安全地释放? - notMyScreenName
5
赋值后的"-1保留计数"表明您永远不应该关注任何对象的绝对保留计数。如果您保留了它,就应该释放它。这就是全部。@""字符串不需要保留/释放是一个实现细节,从技术上讲,不应依赖于它。然而,每个人都这样做,如果实现发生变化,所有内容都会崩溃。 - bbum

2

What does the following line actually do?

string = @"Some text";

Assuming that "string" is declared thusly in the header:

NSString *string;

What does the "=" actually do here? What does it do to "string"'s reference count?

string不是一个字符串。

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

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

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

在垃圾回收代码中,将对象分配到某个位置可以延长对象的生命周期(仅适用于Mac)。有关详细信息,请参见Cocoa内存管理编程指南

*或者C数组。不要将这些与Cocoa数组混淆;它们不可互换,并且您不能使用赋值运算符将内容放入Cocoa集合中(在Objective-C中无法)。


0
当您在这种情况下使用像文字那样的字面量时,它只是一种语法糖,可以快速创建一个NSString对象。一旦创建,该对象的行为就像另一个对象一样。不同之处在于,您的字符串编译到程序中而不是动态创建。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接