Char * vs NSString *

时间:2011-03-26 14:28:14

标签: objective-c c pointers nsstring char

在使用C时,我试图摆脱一些困惑。

在某种意义上,char *name使用NSString *name与使用NSString一样,指针仍指向第一个内存分配吗?

当然char *name有很多额外内容,但这不是我的意思,将与NSString *name合作让我像{{1}}一样工作,这样我就可以未来只需使用指针“名称”吗?

5 个答案:

答案 0 :(得分:19)

答案是否定的。

char*旨在指向一个简单的(或单个)char数据值数组。

char* myCharPtr = "This is a string.";
//In memory: myCharPtr contains an address, e.g. |0x27648164|
//at address 0x27648164: |T|h|i|s| |i|s| |a| |s|t|r|i|n|g|.|\0|

另一方面,NSString *name将是一个指向对象的指针,该对象可能具有 lot 附加内容,并且您不能依赖于存储实际字符数据的位置,或者怎么样。它不是编码为ASCII(Sherm Pendley在下面说它是UTF-16),它可能有额外的数据,如字符串的长度等。

NSString* myStringPtr = @"This is an NSString.";
//In memory: myStringPtr contains e.g. |0x27648164|
//at address 0x27648164: |Object data|length|You don't know what else|UTF-16 data|etc.|

您通过其公开的方法更改和访问未知对象,因为您不知道它们在内存中的格式,因此无法直接访问其数据。 (或者因为它们将自己封装起来以隐藏它。)

如果您将NSString指针声明为NSString *name,则以后仍然可以使用NSString *name = @"This is a string."; NSString *sameName = name; //This is pointing to the same object as name NSLog(@"%@", sameName); //This prints "This is a string.", and if NSStrings were mutable, changing it would change name as well. //They point to the same object. 指针。这就是我的意思:

{{1}}

答案 1 :(得分:4)

char*NSString*是完全不同的字符串实现。

NSString只能在Objective C中使用(不是在普通的C中),表示不可变的字符串,基于Unicode字符而且 - 是一个面向对象的类 - 提供了许多方法。此外,它们是引用计数并始终在堆上分配。

char*只是任何字节数组,其编码没有很好地定义,它是可变的,并且不是面向对象的。可以在堆上(使用char)或在堆栈上分配malloc个数组。前者需要调用free,而后者必须永远不会被释放。

答案 2 :(得分:2)

  

在某种意义上使用char * name   与使用NSString * name相同   指针仍然存在的感觉   指向第一个内存分配   对吗?

我认为您应该将NSString *名称视为对象的句柄而不是指向对象的指针,因此不要假设它指向第一个内存分配。我认为这将是一个更好的比喻。

答案 3 :(得分:0)

没有

char *是指向字符数组的指针。 NSString是一个指向NSString对象的指针。我找不到它的任何文档,但我相信NSString盒子是一个char *。对NSString * name执行名称[1]将引用NSString对象数组的第二个元素。

答案 4 :(得分:0)

从某种意义上说 - 有点无用的意义,确定 - 它们相同,因为它们都是指向内存地址的指针类型。然而,这种相似性在实践中并不是非常有用。要使用其中任何一个,您必须考虑它们指向的“事物”的类型,以及如何使用char数组和NSString实例完全不同。即使对于像赋值一样简单的事情,也需要根据Cocoa的内存管理规则处理NSString实例,使用-copy或-retain而不是简单的“foo = bar”赋值。