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

时间:2016-04-14 16:25:46

标签: objective-c pointers memory mutable

我读了这个答案https://stackoverflow.com/a/833124/5175709和其他一些问题。根据我的理解,由于对象可能会扩展并耗尽空间,因此内存位置也会发生变化。我永远不明白为什么我们不应该**使用NSMutableDataNSMutableArray,因为它们也可以随addappend进行扩展需要更多空间。

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

2 个答案:

答案 0 :(得分:3)

NSMutableData *struct MutableData { void * data; void (*appendBytes)(void * bytes); // etc. }; 不是直接指向所包含数据的指针。他们更倾向于这一点:

decompressedFileStream

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

答案 1 :(得分:2)

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

(这是猜想,因为我无法访问源代码)

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

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

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