由于iOS采用的引用计数,来管理内存,如果相互强引用持有,则无法释放,从而造成内存泄漏。
避免循环引用的规则
1、对象不应该持有它的“父对象”,应使用weak 引用指向它的“父对象”。
这里的父对象,并不单只对象父类的对象。例如:相册和图片
@class HPPhoto
@interface HPAlbum :NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy)HPPhoto *coverPhoto;
@end
@interface HPPhoto :NSObject
@property (nonatomic, strong) HPAlbum *album;
@property (nonatomic, copy) NSString *title;
@end
由于相册和照片相互强引用持有,无法释放。这里可把相册看作图片的父亲,从而将HPPhoto中的HPAlbum改为弱引用。
2、连接对象不应该持有他们的目标对象,目标对象的角色是持有者:连接对象包括以下几种:
- 使用委托的对象。委托应该被当作目标对象。
- 包含目标和action的对象。
- 观察者模式中 的被观察者。观察者就是持有者。
循环引用的常见场景
1、委托。解决办法:将使用委托的对象中的delegate设为弱引用。
2、block块。解决办法:在块外将self弱引用,在块内将弱引用的self再强引用。
3、线程和计时器。
4、观察者模式。
网友评论