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

Why don't mutable objects require double pointers?

提问人:mfaani 提问时间:4/15/2016 最后编辑:Communitymfaani 更新时间:9/19/2016 访问量:58

问:

https://stackoverflow.com/a/833124/5175709 和其他一些问题阅读了这个答案。据我了解,由于对象可能会扩展并耗尽空间,因此我的内存位置也会发生变化。我从来不明白为什么我们不应该使用 for 或因为它们也可以随着任何 ing 或 ing 而扩展并且需要更多空间。**NSMutableDataNSMutableArrayaddappend

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

目标-C 指针 记忆 可变

评论


答:

3赞 jscs 4/15/2016 #1

NSMutableArray *并且不是直接指向所包含数据的指针。它们更像是这样:NSMutableData *

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

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

2赞 trojanfoe 4/15/2016 #2

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

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

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

如果子类想要添加到数据缓冲区中,它可以执行 on 和 increase 。NSMutableDatarealloc()_data_length

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

评论

0赞 mfaani 4/15/2016
谢谢,所以他们实际上使用的是指针到指针,但我们只处理引用?
0赞 trojanfoe 4/15/2016
@asma22 从哲学上讲,是的,但不是在语言意义上。例如,取消引用指针不一定指向该成员;如果之前出现,该类将同样有效。Object **NSMutableData_data_length_data