一. 操作引用计数器的方式:
retainCount:获得对象的引用计数器的值
retain:能够让对象的计数器值+1
release:让对象的计数器值 - 1
二. 怎么判断对象被释放?
dealloc方法:只要调用了这个方法,就代表对象即将被释放.
重写dealloc方法,必须在最后添加上 [super dealloc];
当计数器值为0时会自动调用dealloc释放内存
三. 补充
僵尸对象:已经被释放的对象
野指针:指向僵尸对象的指针
空指针:指向nil的指针,给空指针发送消息(调用方法)不会报任何错误.
四. @property
格式:@property (参数1,参数2,…) 变量类型 变量名(去掉下划线);
retain:参数用于对象类型,能够帮我们生成set方法的内存管理代码.
assign:参数,用于基本数据类型,不做内存管理代码.atomic:对线程加锁,性能低,安全性高(默认).
nonatomic:不对线程加锁,性能高,安全性低.手机端,建议使用nonatomicreadonly:只能操作,只给外界提供get方法,不提供set方法.
readwirte:可读可写.setter:改set方法的名字
getter:改get方法的名字
五. setter的方法的内存管理方式
- (void)setCat:(Cat *)cat
{
if(_cat != cat)
{
[_cat release];
_cat = [cat retain];
}
}
六. @Class
用@Class简单的声明一个类,可用于解决循环引用。
跟#import的区别
(1). import用于引入文件,可以让文件不重复引用,引入文件里面所有的内容,包括成员变量和方法.
(2). @class仅仅告诉编译器,它修饰的是一个类而已.
建议.h文件当中使用@class
七. 循环retain
当A包含B,B包含A;对象都无法被释放.
解决办法:一边用assign 一边用retain
八. NSString类是系统单独做处理的,不能够对其做内存管理操作.
九. 自动释放池
自动释放池出现之前,创建1个对象时,需要在合适的位置调用release.
自动释放池的作用
对池子里面的所有对象,当对象调用autorelease,在池子被释放时,统一做一次release操作.