一. 管理范围: 任何继承了NSObject的对象(NSString , NSArray, ...),对基本数据(int ,float, ...)类型无效.第一类:读写控制(readonly, readwrite)
二. 基本原理:
垃圾回收: (OC不支持垃圾回收).
内存泄漏: 用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元,直到程序结束;(如:对象被创建后,指向它的指针 进行了重新指向, 该对象未被释放, 一直占用内存,直到程序结束, 就会产生内存泄漏)
野指针: 指向一块不可用内存 (即对象被销毁, 指针未清空, 利用 p(指针) = nil; 清空指针, p 变为这指针).
原理:
1.每个对象内部都保存了一个与之关联的整数, 称为引用计数器
2.每当使用 alloc new 或者 copy 创建一个对象时, 对象的引用计数器被设置为1
3.给对象发送一条retain 消息时, 引用计数器 +1;
4.给对象发送一条release 消息时, 引用计数器 - 1
5.一旦计数器为 0 ,那么它将被销毁,其占用的内存被系统回收,OC 也会自动向对象发送一条dealloc 消息.一般会重写dealloc 方法(注意 : super 方法一定写在最后),在这里释放相关资源. 一定不能直接调用dealloc 方法.
对象之间的内存管理
三 . 内存管理原则
1.谁创建, 谁释放. 如果通过alloc new 或 copy 来创建一个对象那么你必须调用 release 或 autorealease. (不是你创建的 , 不用你释放).
2.一般来说, 除了alloc new copy 之外的方法都被声明了autorealease
3.谁retain 谁release. 只要你调用了retain ,无论这个对象如何生成的,你都要调用release.
成员变量的内存管理
1.setter 方法管理
release 旧的成员变量, retain 新的成员变量
2. delloc 方法管理
release成员变量
四. proterty 内存管理
readonly: 只读不写 只声明了getter方法(没有setter方法).
readwrite: 可读可写 (系统默认属性) 生成setter getter 方法 可以在类外可以使用
第二类:原子控制 (atomic , noatomic)
atomic: 为多线程应用程序的安全考虑,经过atomic修饰后, 会占用线程内存资源(一般 应用程序慎用)
noatomic : 单线程下使用
@property (retain) Book *book; // 相当于生成了 上面写的具有内存管理的setter getter 方法.
第三类:语义控制(retain assign copy)
retain: release 旧值, retain 新值 (用于对象).
assign: 直接赋值, 不做内存管理(默认) (用于基本数据类型).
copy :它指出,在赋值时使用传入值的一份拷贝。拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协议的对象类型有效。
第四类: 名称控制
如:
//给getter方法改名字
@property(getter=func1)NSString*address;
//给setter方法改名字注意:新方法名后加: 因为setter方法有参数
@property(setter=func2:)NSString*phoneNum;
//同时改setter和getter方法
@property(getter=func3,setter=func4:)NSString*groupName;
四. autorelease内存管理
@autoreleasepool
{ // 在内存 (栈区) 中创建一个自动释放池
// autorelease 返回的对象本身
// autorelease 会将对象加入池子中 对象的计数器不变
Person *p = [ [ Person alloc] init autorelease];
} // autoreleasepool 执行完 池子销毁, 池子里的所有对象做一次release操作.
苹果官方提供的方法(API):
1.如果方法名是alloc new copy 就不用release 或 autorelease
2.否则必须使用.