8

以下行实际上是做什么的?

string = @"Some text";

假设在标题中声明了“字符串”:

NSString *string;

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

谢谢!

4

3 回答 3

20

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

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

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

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

于 2010-01-13T04:12:57.343 回答
2

以下行实际上是做什么的?

string = @"Some text";

假设在标题中声明了“字符串”:

NSString *string;

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

string不是字符串。

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

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

因为string它是一个变量,而不是 Cocoa 对象,所以它没有引用计数。

在某处分配一个对象可以在垃圾收集代码中延长对象的生命周期(仅在 Mac 上)。有关更多详细信息,请参阅Cocoa 的内存管理编程指南。

*或一个 C 数组。不要将这些与 Cocoa 数组混淆;它们不可互换,并且您不能使用赋值运算符将事物放入 Cocoa 集合中(无论如何,在 Objective-C 中不行)。

于 2010-01-14T17:24:03.330 回答
0

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

于 2010-01-13T04:13:58.847 回答