Objective c 为什么不';可变对象是否需要双指针?

Objective c 为什么不';可变对象是否需要双指针?,objective-c,pointers,memory,mutable,Objective C,Pointers,Memory,Mutable,我读了这个答案和其他一些问题。据我所知,由于对象可能会扩展并耗尽空间,因此内存位置也会发生变化。我一直不明白为什么我们不应该对NSMutableData或NSMutableArray使用**,因为它们也可以通过任何adding或appending进行扩展,并且需要更多的空间 请纠正我理解错误的地方。我很困惑。NSMutableArray*和NSMutableData*不是直接指向所包含数据的指针。它们更像是沿着这条路线: struct MutableData { void * data;

我读了这个答案和其他一些问题。据我所知,由于对象可能会扩展并耗尽空间,因此内存位置也会发生变化。我一直不明白为什么我们不应该对
NSMutableData
NSMutableArray
使用
**
,因为它们也可以通过任何
add
ing或
append
ing进行扩展,并且需要更多的空间


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

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

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

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

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

(这是猜测,因为我没有访问源代码的权限)

如果
NSMutableData
子类想要添加到数据缓冲区,它可以对
\u data
执行
realloc()
,并增加
\u length


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

谢谢,所以他们实际上使用了指向指针的指针,但我们只处理引用?@asma22从哲学上讲,是的,但不是从
对象**
的语言意义上。例如,取消引用
NSMutableData
指针不一定指向
\u data
成员;如果
\u length
\u data
之前,则该类也可以工作。
@interface NSData : NSObject
{
    void *_data;
    NSUInteger _length;
}
@end