2016-10-08 15 views
2

假设我有下面的类定义目的-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个整数

+0

你有一个恒定数组的恒定内容,所以数组和数字将在你的应用程序的数据段中。 'obj.arr'将包含对此数据部分中静态数组的引用。 'obj'将在堆中。 – Paulw11

+1

@ Paulw11这就是常规数组发生的情况,但这不是@ -initialized数组和@常量所发生的情况。 – dasblinkenlight

+0

@ Paulw11,你说的数据段是什么意思?这是在堆上还是在堆栈上?如果我的数组是NSMUtableArray而不是NSArray会怎么样?我的主要问题是堆栈中的内容以及堆中内存的内容是什么。在上面的问题中,我已经根据编辑中的当前答案来理解我的理解。你可以看一下吗? –

回答

2

两个NSArrayNSNumber对象是在堆上分配,不堆栈分配。

他们并不像堆对象,因为编译器使用相对较新的语法@[]从你隐藏它。

当编写

@[@1, @2] 

编译器将其转换为

[NSArray arrayWithObjects: {[NSNumber numberWithInt:1], [NSNumber numberWithInt:2]} count: 2] 

最终的结果如下:堆栈有一个指针指向ClassX类型的对象。这个指针指向的内存以isapointer开始,后跟一个指向其中有NSArrray对象的堆中另一个位置的指针。接下来,堆内存的这部分具有另一个isapointer,随后是指向代表NSArray内部数组的内存块的指针,其中包含指向NSNumber对象的两个指针。每个NSNumber对象都有一个isapointer,随后是表示数字的数据。

+0

感谢@dasblinkenlight我并不关心@符号。我已经编辑了我的问题以解决此问题。我的主要问题是堆栈中的内容以及堆中内存的内容是什么。在上面的问题中,我已经根据编辑中的当前答案来理解我的理解。你可以看一下吗? –

+0

@SmartHome否,说堆栈有四个指针是不正确的;它只有一个。其他三个嵌入其他对象中,全部放在堆中。这些指针可能在构建过程中放置​​在堆栈上,但一旦调用结束,它们就位于堆对象内部。 – dasblinkenlight

+0

谢谢。所以,它看起来像stack有一个指向Class X类型的对象的指针。指针指向的内存将以isapointer开头。然后它将有一个指向堆中具有NSArrray对象的另一个位置的指针。反过来,堆内存的这部分将会有另一个isapointer,然后是两个指向NSNUmber对象的指针,依此类推。那是对的吗?如果是的话,你可以让它成为答案,所以我可以接受它吗? –

相关问题