- 成员变量的内存地址分配
// - 对象的内存地址分配图
// - 1. 查看成员对象的定义
@interface MJPerson : NSObject
/** 年龄 */
@property(nonatomic, assign)int age;
/** 身高 */
@property(nonatomic, assign)int hei;
/** 体重 */
@property(nonatomic, assign)int wei;
@end
// - 2. 对象的赋值
MJPerson *person = [[MJPerson alloc] init];
person.age = 1;
person.hei = 2;
person.wei = 3;
// - 3. 对象的内存地址分配情况
person 地址 : 0x600000b9cea0
person->isa 地址 : 0x600000b9cea0 (person->isa : 指向 Person 这个类的内存地址)
person-> age 地址: 0x600000b9cea8
person-> hei 地址: 0x600000b9ceac
person->wei 地址: 0x600000b9ceb0
[结论]: 由上边的图和代码可知 对象的成员变量在内存中地址是连续的 并且是由低地址->高地址的
- 函数调用栈中的内存地址分配
// - 函数调用栈的内存地址分配图
// - 1. 查看函数的实现
@implementation MJPerson
/** 方法定义 */
- (int)test:(int)age height:(float)height
{
NSLog(@"%s", __func__);
int a = 3;
int b = 4;
int c = 5;
return 0;
}
@end
// - 2. 查看函数的调用方式
[person test:1 height:2];
// - 3. 查看函数的内存分布
person 地址: 0x7ffee73dbf18
_cmd 地址 : 0x7ffee73dbf10
age 地址 : 0x7ffee73dbf0c
height 地址 : 0x7ffee73dbf08
a 地址: 0x7ffee73dbf04
b地址: 0x7ffee73dbf00
c 地址: 0x7ffee73dbefc
[结论]: 由上边的图和代码可知 函数栈中的变量在内存中的分布是连续的, 并且地址是由高地址->低地址的
[堆区, 栈区, 常量区的内存地址] :
堆区 : 0x6***
栈区 : 0x7***
常量区 静态变量区 : 0x1****
iOS 中数据宽度
int c = 0xFFFFFFFFFFFFFFFD;
int d = c+1;
int d1 = c+2;
int d2 = c+3;
c = -3, d = -2, d1 = -1, d2 = 0;
下图所示 32 位机器中数据宽度模型. 0 ~ 0x7FFFFFFF为正数且递增, 0xF0000000 ~ 0xFFFFFFFF 为负数且递增(0xFFFFFFFD = -3, 0xFFFFFFFE = -2, 0xFFFFFFFF = -1, 0xFFFFFFFF + 1 = 0), 有符号的时 最大的正数(0x7FFFFFFF) + 1 = 最小的负数(0xF0000000), 最大的负数(0xFFFFFFFF) + 1 为最小的正数(0).