Objective c Char*vs NSString*

Objective c Char*vs NSString*,objective-c,c,pointers,nsstring,char,Objective C,C,Pointers,Nsstring,Char,在使用C时,我试图消除一些混乱 在某种意义上,使用char*name是否与使用NSString*name相同,指针仍然指向它的第一个内存分配 当然,NSString有很多额外的功能,但这不是我的意思,使用char*name是否允许我像使用NSString*name一样工作,这样我以后就可以只使用指针“name”?否 char*是指向字符数组的指针。NSString是指向NSString对象的指针。我找不到它的任何文档,但我相信NSString包含一个字符*。对NSString*name执行nam

在使用C时,我试图消除一些混乱

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

当然,
NSString
有很多额外的功能,但这不是我的意思,使用
char*name
是否允许我像使用
NSString*name
一样工作,这样我以后就可以只使用指针“name”?

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

答案是否

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*名称声明为
NSString
,那么以后仍然可以使用
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.
在某种意义上使用char*name 与在中使用NSString*名称相同 指针仍然存在的感觉 指向第一个内存分配 为了它


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

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

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


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

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

I解释(在标题中)这里有一个initWithCString:encoding:method,它接受一个以null结尾的C字符串,并给出一个NSString。若要返回,请使用cstringusingencode:@Tim Cooper,请不要更改我的问题标题。?:/@灵感48:根据Tim的理解,我决定编辑的问题标题显示了C对Obj C。当我试图从Obj C跳到C时,我纯粹是出于概念上的原因“编辑他的理解?”提姆不是这里提出问题的人-也许你应该考虑的可能性是你对这个差异有一个不太完美的理解。@ HeliuM3:我意识到你是在寻求概念,但是下面的答案覆盖得很好。我想我应该解释一下实际情况,这不是你要问的,因此为什么我的回答是评论,而不是回答。在内部,NSString实际上是一个unichar数组,一种使用UTF-16编码的16位数据类型。有时它无论如何都是这样。有时候不是。实施细节。(请注意,您的应用程序中永远不会有
NSString
的实例。)