为什么不可变对象需要双指针?

问题描述:

我看过这个回答https://*.com/a/833124/5175709和其他一些问题。从我所了解的情况来看,由于对象可能会扩展并且空间不足,所以我的内存位置也会发生变化。我从来不明白为什么我们不应该为NSMutableDataNSMutableArray使用**,因为它们也可以用任何add ing或append扩大并需要更多空间。为什么不可变对象需要双指针?

请在我理解错误的地方纠正我。我很困惑。

对象引用只需要单指针,因为它不涉及他们管理的内存。例如,NSData类(超类的NSMutableData)可能包含以下实例变量:

(这是猜想,因为我没有访问源代码)

@interface NSData : NSObject 
{ 
    void *_data; 
    NSUInteger _length; 
} 
@end 

如果NSMutableData子想要添加到数据缓冲区,它可以在_data上执行realloc()并增加_length

指向NSMutableData对象本身的指针根本不会改变,它管理的内存对开发人员是隐藏的。

+0

谢谢,所以他们实际上使用指针指针,但我们只处理参考? – Honey

+0

@ asma22从哲学角度来说,是的,但不是在“对象**”的语言意义上。例如,取消引用'NSMutableData'指针不一定指向'_data'成员;如果'_length'出现在'_data'之前,该类将会工作得很好。 – *foe

NSMutableArray *NSMutableData *不是直接指向包含的数据的指针。他们是东西沿着这条线更多:

struct MutableData { 
    void * data; 
    void (*appendBytes)(void * bytes); 
    // etc. 
}; 

当他们需要重新分配的扩张(或收缩),还有就是他们正在操纵一个内部指针。作为包含实例的用户,您不会与其交互。