假设我有一个自定义类:
@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?
提供相关链接将不胜感激。在此先感谢:)
答案 0 :(得分:1)
当你调用SomeClass alloc
方法时,它会在堆上分配内存,内存存储SomeClass
实例的变量,包括intProperty
。
我们假设您没有使用@synthesize重命名intProperty
的实例变量,因此intProperty
属性的备份变量为_intProperty
。
someClass.intProperty = 3;
这行代码将3存储到_intProperty
的地址。编译器可以计算_intProperty
的地址,即someClass
的地址加上a偏移量,偏移量是_intProperty
变量地址距{{1}的开头的距离}。我们知道someClass
的地址,我们可以从中读取或写入它。
但是我们知道,你不能在堆上存储原始类型变量
这是错误的,我们可以在堆上存储一个原语,下面的代码在堆上存储一个整数值。
_intProperty