为什么可变对象不需要双指针?
Why don't mutable objects require double pointers?
我阅读了这个答案 和其他一些问题。据我了解,由于对象可以扩展 运行 超出 space,因此内存位置也会发生变化。我一直不明白为什么我们不应该将 **
用于 NSMutableData
或 NSMutableArray
因为它们也可以用任何 add
ing 或 append
ing 扩展并且需要更多 space.
不对的地方请指正。我很困惑。
NSMutableArray *
和 NSMutableData *
不是直接指向所包含数据的指针。他们更多的是沿着这条线:
struct MutableData {
void * data;
void (*appendBytes)(void * bytes);
// etc.
};
当他们需要重新分配以进行扩展(或收缩)时,他们正在操纵一个内部指针。作为包含实例的用户,您不会与之交互。
对象引用只需要是单个指针,因为它与它们管理的内存无关。例如NSData
class(NSMutableData
的超级class)可能包含以下实例变量:
(这是我无法访问源代码的推测)
@interface NSData : NSObject
{
void *_data;
NSUInteger _length;
}
@end
如果 NSMutableData
subclass 想要添加到数据缓冲区,它可以在 _data
上执行 realloc()
并增加 _length
.
指向 NSMutableData
对象本身的指针根本没有改变,它管理的内存对开发人员是隐藏的。
我阅读了这个答案 和其他一些问题。据我了解,由于对象可以扩展 运行 超出 space,因此内存位置也会发生变化。我一直不明白为什么我们不应该将 **
用于 NSMutableData
或 NSMutableArray
因为它们也可以用任何 add
ing 或 append
ing 扩展并且需要更多 space.
不对的地方请指正。我很困惑。
NSMutableArray *
和 NSMutableData *
不是直接指向所包含数据的指针。他们更多的是沿着这条线:
struct MutableData {
void * data;
void (*appendBytes)(void * bytes);
// etc.
};
当他们需要重新分配以进行扩展(或收缩)时,他们正在操纵一个内部指针。作为包含实例的用户,您不会与之交互。
对象引用只需要是单个指针,因为它与它们管理的内存无关。例如NSData
class(NSMutableData
的超级class)可能包含以下实例变量:
(这是我无法访问源代码的推测)
@interface NSData : NSObject
{
void *_data;
NSUInteger _length;
}
@end
如果 NSMutableData
subclass 想要添加到数据缓冲区,它可以在 _data
上执行 realloc()
并增加 _length
.
指向 NSMutableData
对象本身的指针根本没有改变,它管理的内存对开发人员是隐藏的。