iOS中的循環(huán)引用種類

1.屬性傳值循環(huán)引用

cell 添加到tableView上被tanleView強引用,cell中tableView被強引用异赫,造成循環(huán)引用;

所以cell中tableView應該用weak關鍵字

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  TabelViewCell *cell = ...
  cell.tableView = tableView;
  return cell;
}

@interface TableViewCell: UITableViewCell
 @property (nonatomic, strong) UITableView *tableView;
@end

2.delegate屬性用strong關鍵字循環(huán)引用

class A強引用BView, BView的代理指向A,因為delegate是strong關鍵字修飾,所以BView會強引用A的實例威蕉,造成循環(huán)引用

所以delegate關鍵字應該用weak修飾

定義:
@interface Class A: NSObject
@property (nonatomic, strong) BView *someView;
@property (nonatomic, strong) XXXDelegate delegate;

調用:
self.someView.delegate = self;

3.block捕獲變量橄仍,循環(huán)引用

self持有block,block截獲self(這一點我也沒搞太明白),賦值會把block copy到堆上娩贷,持有相關變量,就是self持有block涧至,block又持有self,形成循環(huán)引用

 self.block = ^{
      self.someProperty = xxx;
 } 

//解決方式
__weak typeOf(self) weakSelf = self;
self.block = ^{
    weakSelf.someProperty = xxx;
}

4.timer循環(huán)引用

viewController--->timer--->viewController
造成循環(huán)引用赘方,使用weak不能夠打破循環(huán)引用:由于timer已經(jīng)加入到runloop中窄陡,而且是個重復循環(huán)操作涂圆,所以這個runloop好像停不下來了。踩衩。。所以timer也就無法釋放萌朱,而他對當前的對象又是強引用。

創(chuàng)建中間層弱引用timer,在deinit銷毀timer

class TimerProxy{

    private weak var target:AnyObject?//一定要是弱引用

    private var selector:Selector?

    init(with target:AnyObject, selector:Selector) {
        self.target = target
        self.selector = selector
    }

    @objc public func executeSelector(){
        if (target != nil) && (selector != nil) {
            target?.perform(selector, with: nil)
        }
    }
    deinit {
        debugPrint("TimerProxy已釋放")
    }
}

使用方法:

 let proxy = TimerProxy.init(with: self, selector: #selector(timerDo))
    timer = Timer.init(timeInterval: 1, target: proxy, selector: #selector(proxy.executeSelector), userInfo: nil, repeats: true)
    RunLoop.current.add(timer!, forMode: .common)

deinit {
    debugPrint("TimerViewController已釋放")
    timer?.invalidate()
    timer = nil
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末锄弱,一起剝皮案震驚了整個濱河市蚯窥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌葵姥,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件句携,死亡現(xiàn)場離奇詭異榔幸,居然都是意外死亡,警方通過查閱死者的電腦和手機矮嫉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門牡辽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人敞临,你說我怎么就攤上這事◆锢剑” “怎么了挺尿?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長炊邦。 經(jīng)常有香客問我编矾,道長,這世上最難降的妖魔是什么馁害? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任窄俏,我火速辦了婚禮,結果婚禮上碘菜,老公的妹妹穿的比我還像新娘凹蜈。我一直安慰自己,他們只是感情好忍啸,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布仰坦。 她就那樣靜靜地躺著,像睡著了一般计雌。 火紅的嫁衣襯著肌膚如雪悄晃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天凿滤,我揣著相機與錄音妈橄,去河邊找鬼。 笑死翁脆,一個胖子當著我的面吹牛眷蚓,可吹牛的內容都是我干的。 我是一名探鬼主播反番,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼溪椎,長吁一口氣:“原來是場噩夢啊……” “哼普舆!你這毒婦竟也來了?” 一聲冷哼從身側響起校读,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤沼侣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后歉秫,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛾洛,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年雁芙,在試婚紗的時候發(fā)現(xiàn)自己被綠了轧膘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡兔甘,死狀恐怖谎碍,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情洞焙,我是刑警寧澤蟆淀,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站澡匪,受9級特大地震影響熔任,放射性物質發(fā)生泄漏。R本人自食惡果不足惜唁情,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一疑苔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧甸鸟,春花似錦惦费、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至篮绰,卻和暖如春后雷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吠各。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工臀突, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贾漏。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓候学,卻偏偏與公主長得像,于是被迫代替她去往敵國和親纵散。 傳聞我的和親對象是個殘疾皇子梳码,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353