nstimer經常會被作為類的成員變數,而nstimer初始化時要指定self為target,造成迴圈引用。 另一方面,若timer一直處於validate的狀態,則其引用計數將始終大於0。先看一段nstimer使用的例子(arc模式):
解決方案: 自定義類: wsweaktimertarget
.h檔案
@inte***ce
wsweaktimertarget : nsobject
+ (nstimer *)scheduledtimerwithtimeinterval:(nstimeinterval)ti target:(id)atarget selector:(sel)aselector userinfo:(nullable id)userinfo repeats:(bool)yesorno;
@end
.m檔案
#import "wsweaktimertarget.h"
@inte***ce
wsweaktimertarget()
@property (nonatomic, weak) id atarget;
@property (nonatomic, assign) sel aselector;
@end
@implementation
wsweaktimertarget
+ (nstimer *)scheduledtimerwithtimeinterval:(nstimeinterval)ti target:(id)atarget selector:(sel)aselector userinfo:(nullable id)userinfo repeats:(bool)yesorno
- (void)update:(nstimer *)timer
詳見這篇文章:
例如: 在delegate模式中,viewcontroller和view之間是**模式,viewcontroller有view的使用權,viewcontroller同時也是view的**(處理view中的事件)),那麼此時就可能形成了迴圈引用.
所以在宣告**屬性的時候,一般使用:
@property(nonatomic,weak)id delegate; (arc)
@property(nonatomic,assign)id delegate; (mrc)
iOS開發 迴圈引用
表示弱引用。表示強引用。迴圈引用可以簡單理解為物件a引用了物件b,而物件b又引用了物件a a b a,此時雙方都同時保持對方的乙個引用,導致任何時候雙方的引用計數都不為0,雙方始終無法釋放就造成記憶體洩漏。當然不只是兩個物件之間相互引用會形成迴圈引用,多個物件之間相互引用最終形成環同樣會形成迴圈引用...
iOS迴圈引用問題
今天面試問道了迴圈引用,所以就看了看,原來只是知道使用了block容易造成迴圈引用。今天就來簡單的介紹一些迴圈引用。先來簡單介紹一下什麼是迴圈引用?迴圈引用可以簡單的理解成 a物件引用了b物件,b物件又引用了a物件。兩者相互保持對方的乙個引用。導致任何時候計數都不為0,最終兩者都無法釋放。產生迴圈引...
ios 中的迴圈引用問題及解決
迴圈引用,指的是多個物件相互引用時,使得引用形成乙個環形,導致外部無法真正是否掉這塊環形記憶體。其實有點類似死鎖。舉個例子 a b c x b 表示強引用,這樣的b的引用計數就是2,假如a被系統釋放了,理論上a會自動減小a所引用的資源,就是b,那麼這時候b的引用計數就變成了1,所有b無法被釋放,然而...