iOS開發中的迴圈引用問題

2021-07-10 13:52:36 字數 1249 閱讀 4166

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無法被釋放,然而...