假设我有下面的类定义目的-C:在哪里是对应于存储的一个对象的一个实例变量的指针
@interface ClassX: NSObject
@property NSArray *arr;
@end
假设我有在一个方法中,以下行
-(void)someMethod
{
ClassX *obj = [ClassX new];
obj.arr = [NSArray arrayWithObjects:[NSNumber numberWithInt:2], [NSNumber numberWithInt:3], nil]; //Edit to avoid getting derailed by differences due to @ notation
}
什么是堆栈,堆中有什么?
堆栈:
obj在堆栈中。此变量的值是obj所在堆中地点的地址。
堆:
型ClassX
怎么样的NSArray和NSArray的内NSNUmbers的对象?他们是否也如上所述分开? I.e指向NSArray的指针位于堆栈中,NSArray对象位于堆中?如果是,那么包含“obj”对象的堆内存中包含了什么?
我看到的数字是,在堆存储器的这个块包含isa
指针,然后实例变量。指针isa
指向Class structure
的位置。即,这段内存包含另一个isa指针,后面跟着Method structs
。每个结构都有一个selector
和一个pointer
到对应实现开始的地方。
这似乎表明对象内的区域变量是在堆中。即,指向NSArray对象的指针位于堆中。
编辑 根据下面的答案,这是一个正确的看法堆和栈中有什么?
堆栈将包含4个指针,一到OBJ,一到的NSArray,两到NSNumber的对象。
开始于地址指向obj
堆存储器具有 1. isapointer
指向ClassX类结构 2.其次存储器来存储的NSArray对象。
此NSArray对象内存有 1. isapointer指向NSArray类结构 2.其次是内存来存储2个NSNumber对象。
的NSNumber的对象存储器包含 1.一种isapointer指向的NSNumber类结构 2.其次存储器来存储2个整数
你有一个恒定数组的恒定内容,所以数组和数字将在你的应用程序的数据段中。 'obj.arr'将包含对此数据部分中静态数组的引用。 'obj'将在堆中。 – Paulw11
@ Paulw11这就是常规数组发生的情况,但这不是@ -initialized数组和@常量所发生的情况。 – dasblinkenlight
@ Paulw11,你说的数据段是什么意思?这是在堆上还是在堆栈上?如果我的数组是NSMUtableArray而不是NSArray会怎么样?我的主要问题是堆栈中的内容以及堆中内存的内容是什么。在上面的问题中,我已经根据编辑中的当前答案来理解我的理解。你可以看一下吗? –