objective-c – 为什么不需要解除引用NSString指针?

objective-c – 为什么不需要解除引用NSString指针?,第1张

概述在示例中 NSString *message = @"Hello";message = @"World"; 如果消息只是一个指针,为什么我不需要明确说出消息中的任何内容现在等于字符串或* message = @“World”;喜欢在C? 免责声明 下面的讨论给出了一个总体思路,说明为什么你永远不会在Objective-C中取消引用指向对象的指针. 但是,关于NSString文字的具体情况,这不是 在示例中
Nsstring *message = @"Hello";message = @"World";

如果消息只是一个指针,为什么我不需要明确说出消息中的任何内容现在等于字符串或* message = @“World”;喜欢在C?

解决方法 免责声明

下面的讨论给出了一个总体思路,说明为什么你永远不会在Objective-C中取消引用指向对象的指针.
但是,关于Nsstring文字的具体情况,这不是现实中发生的事情.虽然下面描述的结构仍然是正确的,并且可能以这种方式工作,但实际发生的是字符串文字的空间在编译时分配,并且您得到它的地址.字符串文字也是如此,因为它们是不可变的和常量的.为了提高效率,每个文字只分配一次.

事实上

Nsstring * a = @"Hello";Nsstring * b = @"Hello";NSLog(@"%@ %p",a,a); // Hello 0x1f4958NSLog(@"%@ %p",b,b); // Hello 0x1f4958

原始答案

因为它会被翻译成

message = [[Nsstring alloc] initWithUTF8String:"Hello"]];

这将归结为

message = objc_msgSend(objc_msgSend(objc_getClass("Nsstring"),@selector(alloc)),@selector(initWithUTF8String:),"Hello");

现在,如果我们看一下objc_msgSend的签名

ID objc_msgSend(ID theReceiver,SEL theSelector,...)

我们看到该方法返回一个ID类型,它在Objective-C中是对象类型.但是如何定义ID?

typedef struct objc_object {    Class isa;} *ID;

ID被定义为指向objc_object结构的指针.

所以最后@“string”将在一个函数调用中进行转换,该函数调用将产生一个指向对象的指针(如果你愿意,也可以是一个objc_object结构),这正是你需要分配给消息的.

底线,您指定指针,而不是对象.

为了更好地阐明最后的概念,请考虑这一点

NSMutableString * a = [NSMutableString stringWithString:@"hello"];NSMutableString * b = a;[a setString:@"hola"];NSLog(@"%@",a); // "hola"NSLog(@"%@",b); // "hola"

如果您正在分配对象,则b将是a的副本,并且对a的任何进一步修改都不会影响b.

相反,你得到的是a和b是指向堆中同一对象的两个指针.

总结

以上是内存溢出为你收集整理的objective-c – 为什么不需要解除引用NSString指针?全部内容,希望文章能够帮你解决objective-c – 为什么不需要解除引用NSString指针?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/1234392.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存