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

Why don't mutable objects require double pointers?

我阅读了这个答案 和其他一些问题。据我了解,由于对象可以扩展 运行 超出 space,因此内存位置也会发生变化。我一直不明白为什么我们不应该将 ** 用于 NSMutableDataNSMutableArray 因为它们也可以用任何 adding 或 appending 扩展并且需要更多 space.

不对的地方请指正。我很困惑。

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

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

当他们需要重新分配以进行扩展(或收缩)时,他们正在操纵一个内部指针。作为包含实例的用户,您不会与之交互。

对象引用只需要是单个指针,因为它与它们管理的内存无关。例如NSDataclass(NSMutableData的超级class)可能包含以下实例变量:

(这是我无法访问源代码的推测)

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

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

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