ARC又叫自动引用计数.
ARC的判断准则:只要没有强指针指向对象,就会释放对象。
指针分两种:
1)强指针,默认情况下,所有指针都是强指针 __strong
2) 弱指针,__weak 使用示例:__weak Person * p = [[Person alloc] init];
手动管理内存到ARC的等效转变
@propery(nonatomic,retain) -----> @property(nonatomic,strong) 适用于OC对象
@propery(nonatomic,assign) -----> @property(nonatomic,weak) 适用于OC对象
@propery(nonatomic,assign) -----> @property(nonatomic,assign) 适用于基本类型
循环引用问题在ARC中的解决:一个属性用strong,另一个用weak即可。
方法:
可以给对象发送retainCount消息(调用retainCount方法)获得当前的引用计数器值
对象的销毁
1.当一个对象的引用计数器为0时,那么它将被销毁,系统会回收它所占的内存。
2.当一个对象被销毁时,系统会自动向对象发送一条dealloc消息。
3.一般会重写dealloc方法,在这里释放相关资源,dealloc就像对象的遗言。
4.一旦重写dealloc方法,就必须调用[super dealloc];并放在最后面调用。
5.不要直接调用dealloc方法
6.一旦对象被回收了,它占用的内存就不再可用,坚持使用会导致程序崩溃(野指针错误)。
三、@property参数
1>控制set方法的内存管理
1.retain:release旧值、retian新值(用于oc对象)。
2.assign:直接赋值,不做任何内存管理(默认用于非oc对象,可以用于oc对象)。
3.copy:release旧值,copy新值(一般用于NSString *);
2>控制是否生成getter和setter
1.readonly:只会生成getter。
2.redawrite:同时生成getter和setter。
3>多线程管理
1.atomic:性能低(默认)。
2.nonatomic:性能高。
4>控制set方法和get方法的名称
setter:设置set方法的名称,一定有个冒号:因为冒号是方法的一部分。
getter:设置get方法的名称。
五、autorelease
1>autorelease
1.给某个对象发送一条autorelease消息时,就会将这个对象加到一个自动释放池中。
2.当自动释放池销毁时,会给池子里面的所有对象发送一条release消息。
3.调用autorelease方法时不会改变对象的计数器,并且返回对象本身。
4.只有当pool释放时,该pool的对象才会被依依release。
在程序运行过程中,可以创建多个自动释放池,它们是以栈的形式存在内存中。
参考: https://www.cnblogs.com/comcn/p/4353226.html
网友评论