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