内存管理
一、内存
4个部分:
常量区 (如:10,"abc") 效率最高
全局静态区 (如:定义的全局变量,静态变量)
栈区 (如:成员变量、参数)
堆区 (如:所有创建的OC对象)
堆、栈的区别?
栈区 空间小(5-10M)、先进后出
堆区 空间大(?G)、 无序的
管理方式:
1.基于垃圾回收的(系统完成)
2.基于引用计数的(手动完成)
OC的内存管理:
NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = obj1;
使用:obj1,obj2
[obj1 release];
[obj2 release];
前提:只有OC的对象才需要内存管理
定义:如果你使用alloc、copy、retain等关键字来得到对象的所有权,你就有义务
有责任,使用release、autorelease来释放该对象的所有权。
公式:alloc+retain+copy = release+autorelease;
原理:基于引用计数(retainCount)
一个对象被多少个对象引用,该对象的引用计数就应该是多少
属性的特性:与内存管理相关的
assgin 用于C语言的数据类型
copy 用于OC字符串
retain 用于OC对象
浅拷贝与深拷贝
浅拷贝:复制引用对象的指针(如:assgin、retain)
深拷贝:复制引用对象本身(如:copy)
注意:
1.iOS的内存管理是基于引用计数的,它不支持垃圾回收机制。
二、
NSObject *obj = [[NSObject alloc] init];
int num = 10;
指针(*):存储对象在内存中的首地址
三、OC的内存管理
前提:OC的对象才需要进行内存管理
引用计数(retainCount):对象被引用的个数
alloc:分配堆的内存、设置对象的引用计数为1
retain:+1
release:-1
dealloc:对象引用计数为0时
内存管理:
在代码块中:alloc + retain = release
注意:
1.OC的内存管理只用于管理堆区的内存
2.OC的内存管理是基于对象的引用计数的
错误:EXC_BAD_ACCESS
原因:执行的错误的内存地址,一个对象已经被销毁,不能在使用
解决:自己找
一、内存
4个部分:
常量区 (如:10,"abc") 效率最高
全局静态区 (如:定义的全局变量,静态变量)
栈区 (如:成员变量、参数)
堆区 (如:所有创建的OC对象)
堆、栈的区别?
栈区 空间小(5-10M)、先进后出
堆区 空间大(?G)、 无序的
管理方式:
1.基于垃圾回收的(系统完成)
2.基于引用计数的(手动完成)
OC的内存管理:
NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = obj1;
使用:obj1,obj2
[obj1 release];
[obj2 release];
前提:只有OC的对象才需要内存管理
定义:如果你使用alloc、copy、retain等关键字来得到对象的所有权,你就有义务
有责任,使用release、autorelease来释放该对象的所有权。
公式:alloc+retain+copy = release+autorelease;
原理:基于引用计数(retainCount)
一个对象被多少个对象引用,该对象的引用计数就应该是多少
属性的特性:与内存管理相关的
assgin 用于C语言的数据类型
copy 用于OC字符串
retain 用于OC对象
浅拷贝与深拷贝
浅拷贝:复制引用对象的指针(如:assgin、retain)
深拷贝:复制引用对象本身(如:copy)
注意:
1.iOS的内存管理是基于引用计数的,它不支持垃圾回收机制。
二、
NSObject *obj = [[NSObject alloc] init];
int num = 10;
指针(*):存储对象在内存中的首地址
三、OC的内存管理
前提:OC的对象才需要进行内存管理
引用计数(retainCount):对象被引用的个数
alloc:分配堆的内存、设置对象的引用计数为1
retain:+1
release:-1
dealloc:对象引用计数为0时
内存管理:
在代码块中:alloc + retain = release
注意:
1.OC的内存管理只用于管理堆区的内存
2.OC的内存管理是基于对象的引用计数的
错误:EXC_BAD_ACCESS
原因:执行的错误的内存地址,一个对象已经被销毁,不能在使用
解决:自己找