Ios Objective-C:与存储的对象的实例变量相对应的指针在哪里

Ios Objective-C:与存储的对象的实例变量相对应的指针在哪里,ios,objective-c,pointers,memory-management,Ios,Objective C,Pointers,Memory Management,假设我有下面的类定义 @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

假设我有下面的类定义

@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内的NSArray编号如何?它们是否也按上述方式划分?也就是说,指向NSArray的指针在堆栈中,NSArray对象在堆中?如果是,包含“obj”对象的堆内存中包含什么

我看到的图是堆中的内存块包含一个
isa
指针,然后是实例变量。
isa
指针指向
类结构的位置。也就是说,这段内存包含另一个isa指针,后跟
方法结构。每个结构都有一个
选择器
和一个指向相应实现开始位置的
指针

这似乎表明对象中的区域变量在堆中。也就是说,指向NSArray对象的指针在堆中

编辑 根据下面的答案,这是对堆和堆栈中的内容的正确看法吗

堆栈将包含4个指针,一个指向obj,一个指向NSArray,两个指向NSNumber对象

obj
指向的地址开始的堆内存 1.
isapointer
pointingclassx类结构 2.然后是存储NSArray对象的内存

此NSArray对象内存具有 1.指向NSArray类结构的ISA指针 2.然后是存储2个NSNumber对象的内存

NSNUmber对象内存包含 1.指向NSNumber类结构的指针
2.然后是存储2个整数的内存这两个
NSArray
NSNumber
对象都是堆分配的,而不是堆栈分配的

它们看起来不像堆对象,因为编译器使用相对较新的语法
@[]
将其隐藏起来

当你写作时

@[@1, @2]
编译器将其翻译为

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

最终结果如下:堆栈有一个指向
ClassX
类型的对象的指针。此指针指向的内存以isapoter开头,后跟指向堆中另一个位置的指针,该位置中有
nsarray
对象。反过来,堆内存的这一部分有另一个isapoter,后面是一个指向内存块的指针,该内存块表示
NSArray
的内部数组,包含指向
NSNumber
对象的两个指针。每个
NSNumber
对象都有一个isapointer,后面是表示数字的数据。

您有一个包含常量内容的常量数组,因此数组和数字将位于应用程序的数据段中
obj.arr
将在此数据段中包含对静态数组的引用
obj
将在堆中。@Paulw11这是常规数组的情况,但不是@初始化数组和@常量的情况。@Paulw11,数据段是什么意思?这是在堆上还是在堆栈上?如果我将数组设置为NSMUtableArray而不是NSArray,该怎么办?我的主要问题是堆栈中有什么,堆中内存的内容是什么。我已将基于当前答案的理解放在上述问题的
Edit
下。你能看一看吗?这既不是堆也不是堆;这是一个内存区域,其(初始)值直接从程序的二进制文件中复制。请注意,objective-c对象永远不会在堆栈上。感谢@dasblinkenlight,我不关心@notation。我已编辑了上面的问题以删除此内容。我的主要问题是堆栈中有什么,堆中内存的内容是什么。我已将基于当前答案的理解放在上述问题的
Edit
下。你能看一下吗?@SmartHome不,说堆栈有四个指针是不正确的;它只有一个。其他三个都嵌入在堆中的其他对象中。这些指针可能在构造期间放置在堆栈上,但一旦调用结束,它们就在堆对象内。谢谢。因此,堆栈似乎有指向X类对象的指针。该指针指向的内存将以isapointer开头。然后,它将有一个指向堆中另一个包含nsarray对象的位置的指针。反过来,堆内存的这一部分将有另一个isapointer,后跟指向NSNUmber对象的两个指针,依此类推。对吗?如果是,请您回答,这样我可以接受吗?@SmartHome是的,您评论中的描述是正确的。