Char *与NSString *的区别

4
我正在尝试消除在使用C语言时的一些困惑。
在某种意义上,使用“char *name”与使用“NSString *name”是否相同?这是因为指针仍然指向它的第一个内存分配位置吗?
当然,“NSString”有很多额外的功能,但这不是我的意思。使用“char *name”是否允许我像使用“NSString *name”一样工作,以便将来只需使用指针“name”即可?

有一个名为initWithCString:encoding:的方法,它接受以空字符结尾的C字符串并返回一个NSString。要返回,请使用cStringUsingEncoding:方法。 - FeifanZ
1
@Inspire48:我的问题标题被Tim修改了,他的理解是关于C和Obj C的。我只是想为了概念上的原因,尝试从Obj C转向C。 ;) - some_id
“根据他的理解进行编辑?”蒂姆不是在这里提问的人-也许你应该考虑一下可能是对差异的理解不够完美。 - Sherm Pendley
@Sherm:没必要这么严厉。我认为Helium3的意思是他试图强调他正在努力理解Objective-C和C之间的区别。 - Chris Cooper
1
@Helium3:我意识到你在询问概念性问题,但下面的答案已经很好地涵盖了这一点。我想我可以为实际问题提供一些帮助,这并不是你所要求的——这就是为什么我的回复是评论而不是答案的原因。 - FeifanZ
显示剩余2条评论
5个回答

22
答案是否定的。 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 将是一个指向对象的指针,该对象可能有很多额外信息,您不能依赖于实际字符数据存储的位置或方式。它不是以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 *name,你仍然可以在未来使用NSString指针。这就是我的意思:
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.

5

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

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

char* 只是任何字节数组,其编码未定义,是可变的,而且不是面向对象的。 char 数组可以在堆上进行分配(使用 malloc)或在栈上进行分配。前者需要调用 free,而后者则永远不能被释放。


我在标题中解释了我没有混淆它们,也没有谈论NSString的额外内容。 - some_id

2

在某种意义上,使用char *name和使用NSString *name是否相同,指针是否仍然指向它的第一个内存分配?

我认为你应该把NSString * name视为对象的句柄,而不是指向对象的指针,并且不要假设它指向第一个内存分配。我认为这将是一个更好的比喻。


1

不,

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


2
在内部,NSString 实际上将 unichar 数组打包,unichar 是一种使用 UTF-16 编码的 16 位数据类型。 - Sherm Pendley
1
有时候它确实会这样做,有时候不会。 这涉及到具体的实施细节。(请注意,您的应用程序中实际上永远不会有NSString的实例。) - bbum

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

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