循环引用

2018-11-01  本文已影响81人  小五92

由于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、连接对象不应该持有他们的目标对象,目标对象的角色是持有者:连接对象包括以下几种:

循环引用的常见场景

1、委托。解决办法:将使用委托的对象中的delegate设为弱引用。
2、block块。解决办法:在块外将self弱引用,在块内将弱引用的self再强引用。
3、线程和计时器。
4、观察者模式。

上一篇 下一篇

猜你喜欢

热点阅读