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是的,您评论中的描述是正确的。