objective-C类是否在堆上存储基本类型属性?

时间:2016-12-06 01:53:47

标签: objective-c

假设我有一个自定义类:

@interface someClass : NSObject
@property (nonatomic, assign) int intProperty;
@end

它有一个方法:

- (void)test {
    NSLog(@"%p", &(_intProperty));
}

执行以下代码:

SomeClass* someClass = [[SomeClass alloc] init];
someClass.intProperty = 3;
[someClass test];

输出结果为:

2016-12-05 19:42:33.001951 test[2316:881536] 0x17401d078

看起来像堆上的地址。但正如我们所知,您无法在堆上存储基本类型变量。那么它如何从指向堆地址的指针读取int?

提供相关链接将不胜感激。在此先感谢:)

1 个答案:

答案 0 :(得分:1)

当你调用SomeClass alloc方法时,它会在堆上分配内存,内存存储SomeClass实例的变量,包括intProperty

我们假设您没有使用@synthesize重命名intProperty的实例变量,因此intProperty属性的备份变量为_intProperty

someClass.intProperty = 3;这行代码将3存储到_intProperty的地址。编译器可以计算_intProperty的地址,即someClass的地址加上a偏移量,偏移量是_intProperty变量地址距{{1}的开头的距离}。我们知道someClass的地址,我们可以从中读取或写入它。

  

但是我们知道,你不能在堆上存储原始类型变量

这是错误的,我们可以在堆上存储一个原语,下面的代码在堆上存储一个整数值。

_intProperty