閉包的迴圈引用

2021-08-07 23:21:44 字數 1409 閱讀 4049

[unowned self]

面試題:請說出工作中遇到的迴圈引用(不要說沒有遇到過)

class

viewcontroller: uiviewcontroller

}func

loaddata

(completion: ()->()) -> ()}}

// 析構函式 - 類似於 oc 的 dealloc

deinit

}

方法一// 1. 方法一,類似於 oc 的方法

// * weak 修飾的變數有可能在執行時被修改為 nil,因此不能使用 let

weak

var weakself = self

loaddata

方法二

// 2. 方法二,swift 的寫法

// [weak self] 表示閉包中的 self 是弱引用,如果 self 被釋放,會自動設定為 nil

// 與 oc 的 `__weak` 等效

loaddata

方法三 —— 知道就行// 3. 方法三

// [unowned self] 表示閉包中的 self 是 assign 的,如果 self 被釋放,指標位址保持不變

// 會出現野指標的錯誤

// 與 oc 的 `__unsafe_unretained` 等效

loaddata

@inte***ce

demoviewcontroller ()

@property (weak, nonatomic) iboutlet

uilabel *tiplabel;

@property (nonatomic, copy) void (^completionblock)();

@end

@implementation

demoviewcontroller

- (void)viewdidload ];

// 方法二:使用 __unsafe_unretained 解除迴圈引用,一旦 self 被釋放,會報野指標錯誤

__unsafe_unretained typeof(self) weakself = self;

[self loaddatawithcompletion:^];

}- (void)loaddatawithcompletion:(void (^)())completion );

});}- (void)dealloc

@end

swift 閉包迴圈引用的解決辦法

模擬網路請求,封裝工具類,使用閉包變數對閉包進行強引用 networkrequesttool.swift test created by fe on 2017 2 28.import uikit class networkrequesttool nsobject 在控制器中呼叫工具類,在閉包內使用s...

Swift中閉包的迴圈引用及改正

迴圈引用的產生原因 兩個物件互相之間強引用,導致互相不能釋放,後果就是兩個物件都不釋放,導致兩個物件的記憶體都不能釋放,這就會產生所謂的記憶體洩露。swift閉包迴圈引用產生的兩個條件 1.物件對閉包強引用,即閉包是物件的屬性。2.閉包中對物件強引用,閉包對閉包中的成員變數都會強引用一次。stude...

閉包返回函式不引用迴圈變數

def count fs for i in range 1,4 def f return i i return fs f1,f2,f3 count print f1 9 print f2 9 print f3 9 全部都是9 原因就在於返回的函式引用了變數i,但它並非立刻執行。等到3個函式都返回時,...