【问题标题】:Why don't mutable objects require double pointers?为什么可变对象不需要双指针?
【发布时间】:2016-04-14 16:25:46
【问题描述】:

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

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

【问题讨论】:

    标签: objective-c pointers memory mutable


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

      • 谢谢,原来他们其实是用指针指向指针,但我们只处理引用?
      • @asma22 从哲学上讲,是的,但不是Object ** 的语言意义。例如,取消引用 NSMutableData 指针不一定指向 _data 成员;如果 _length 出现在 _data 之前,该类也可以正常工作。
      猜你喜欢
      • 1970-01-01
      • 2013-12-15
      • 2010-10-28
      • 1970-01-01
      • 2017-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多