为什么不可变对象需要双指针?
问题描述:
我看过这个回答https://*.com/a/833124/5175709和其他一些问题。从我所了解的情况来看,由于对象可能会扩展并且空间不足,所以我的内存位置也会发生变化。我从来不明白为什么我们不应该为NSMutableData
或NSMutableArray
使用**
,因为它们也可以用任何add
ing或append
扩大并需要更多空间。为什么不可变对象需要双指针?
请在我理解错误的地方纠正我。我很困惑。
答
对象引用只需要单指针,因为它不涉及他们管理的内存。例如,NSData
类(超类的NSMutableData
)可能包含以下实例变量:
(这是猜想,因为我没有访问源代码)
@interface NSData : NSObject
{
void *_data;
NSUInteger _length;
}
@end
如果NSMutableData
子想要添加到数据缓冲区,它可以在_data
上执行realloc()
并增加_length
。
指向NSMutableData
对象本身的指针根本不会改变,它管理的内存对开发人员是隐藏的。
答
NSMutableArray *
和NSMutableData *
不是直接指向包含的数据的指针。他们是东西沿着这条线更多:
struct MutableData {
void * data;
void (*appendBytes)(void * bytes);
// etc.
};
当他们需要重新分配的扩张(或收缩),还有就是他们正在操纵一个内部指针。作为包含实例的用户,您不会与其交互。
谢谢,所以他们实际上使用指针指针,但我们只处理参考? – Honey
@ asma22从哲学角度来说,是的,但不是在“对象**”的语言意义上。例如,取消引用'NSMutableData'指针不一定指向'_data'成员;如果'_length'出现在'_data'之前,该类将会工作得很好。 – *foe