有”创建“就要有”销毁“
针对创建和销毁过程进行管理
OC采用”引用计数“管理内存
1、使用alloc为对象分配内存,使用dealloc释放对象所占用的内存
2、使用alloc、new或者copy够着对象时,对象的retainCount为1
3、调用对象的retain方法可以增加1 retainCount
4、调用对象的release方法可以减少1 retainCount
5、当对象的retainCount为0时,dealloc会自动调用,释放对象内存;否则,分配给对象的内存将会被一直占用。
6、所有对象可以使用retainCount属性查看当前的计数器值。
申请内存的权利有两种 1是程序员 2是系统
会影响计数器的操作
1、alloc创建一个对象,并将其引用计数器设为1,并拥有对象的所有权
2、copy制造一个副本,并将副本的引用计数器设为1,并拥有副本的所有权,然后释放旧对象
3、retain使对象计数器加1,并拥有对象所有权
4、release使对象计数器加1,并拥有对象所有权
5、autorelease向autoreleasepool注册
一个类中,如果这个类属性声明retain或者copy的属性,那么我们需要在这个类的dealloc方法里面释放这个属性
便利构造器
return[stu autorelease]; 不立即释放,而是交给autoreleasepool
内存释放原则:
1、谁申请谁释放
2、凡是出现retain、alloc、copy的地方,都应出现release与之匹配使用。
3、a 内存无法确定释放时间时,可以只用autorelease向最近的池注册
b 由池决定释放所有池的时间
c 使用便利构造器获得的对象,都应是autorelease的
retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的引用计数为1
1、使用copy:对NSString
2、使用retain:对其他NSObject和其子类
strong和weak关键字的意义和使用方法
@property(strong) MyClass * myObjiect;
相当于:@property(retain)
MyClass * myObjiect;
@property(weak) MyOtherClass * delegate;
相当于:
@property(assign) MyOtherClass * delegate;
一般情况下,所有的指针都是强指针