以下行实际上做了什么?
string = @"Some text";
假设在标题中声明了“string”:
NSString *string;
“=”实际上在这里做什么?它对“字符串”的引用计数有什么作用?特别是,假设由于某种原因“字符串”没有另外分配,是否需要释放?
谢谢!
答案 0 :(得分:20)
任务就是这样。 string
指针基本上是一个指向内存中特定地址的标签。重新分配语句会将该标签指向内存中的另一个地址!
它不会更改引用计数或在Objective-C中执行任何操作。如果您在非垃圾收集环境中运行,则需要自己维护引用计数:
[string release];
string = [@"Some text" retain];
但是,不需要管理字符串文字,因为它们是静态分配的,永远不会被释放!因此release
和retain
方法只是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对象只是语法糖。一旦创建,该对象就像另一个一样。这里的区别在于您的字符串被编译到程序中而不是动态创建。