一,堆与栈
1,栈区,stack: 后进先出,由编译器自动分配并释放,一般存放函数的参数值、局部变量
2,堆区,heap:先进先出,由程序员分配和释放
3,全局区,静态区:程序结束后由系统释放,
4,寄存区:保存栈顶指针和指令指针
5,文字常量区
6,程序代码区,存放函数的二进制代码
链表:头指针head,
栈区:main中有i和j变量 i 地址比 j 地址 大
栈区大小为1M
堆:(系统内存和虚拟内存)
1,所有应用程序共享
2,所有堆中的内存分配,都是操作系统负责的
3,操作系统使用链表来维护所有已经分配的内存
4,堆中的内存释放,程序通知系统释放内存。引用计数为0,会被立即释放
5,堆中的所有空间,都是“匿名”访问的,所有匿名访问都是通过指针来访问
在OC中没有垃圾回收机制
NULL表示地址为0
nil 是地址指向NULL的空对象
nil可以调用任何方法不会报错
copy:建立一个副本,互不干扰
可变不可变 是 针对 Foundation 框架的数据类型
对于自定义类 copy就是可变
arrayM M就是可变的意思
可变copy为可变或不可变 地址都会变
不可变copy为不可变(浅复制) 地址不变
NSMutableArray *arrayM = [NSMutableArray arrayWithObjects:@(), @(), nil];
NSLog(@"%@ %p %@", arrayM, arrayM, arrayM.class); //1,可变 =》 可变
NSMutableArray *aM = [arrayM mutableCopy];
NSLog(@"%@ %p %@", aM, aM, aM.class);
//2,可变 =》 不可变
NSArray *a = [arrayM copy];
NSLog(@"%@ %p %@", a, a, ,a.class);