jar*_*ryd 4 c pointers objective-c char nsstring
我正在努力摆脱与C一起工作时的一些困惑.
是使用char *name在某种意义上一样有工作NSString *name在这个意义上,指针仍指向它的第一个内存分配?
Ofcourse NSString有一堆额外的东西,但这不是我的意思,将char *name允许我工作,就好像它是一个NSString *name,以便我将来可以使用指针"名称"吗?
Chr*_*per 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|
Run Code Online (Sandbox Code Playgroud)
另一方面,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.|
Run Code Online (Sandbox Code Playgroud)
您通过其公开的方法更改和访问未知对象,因为您不知道它们在内存中的格式,因此无法直接访问它们的数据.(或者因为它们封装自己以隐藏它.)
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.
Run Code Online (Sandbox Code Playgroud)
char*和NSString*是两个完全不同的字符串实现。
NSString只能在目标C中使用(不能在普通C中使用),表示不可变的字符串,基于Unicode字符,并且-作为一个面向对象的类-提供了许多方法。此外,它们被引用计数,并且总是分配在堆上。
char*只是任何字节数组,其编码定义不正确,可变且不是面向对象的。char数组可以在堆上(通过malloc)或堆栈上进行分配。前者需要调用free,而后者绝不能释放。