循環引用 && weak strong
阿新 • • 發佈:2017-12-31
turn child rip nsthread left 成員變量 type bsp 弱引用
@weakify _weak
_weak
@weakify(self); // RAC _weak的self_weak_變量
- 解決循環引用
- 問題: weakSelf是弱引用,會被釋放
_weak typeof(self) weakSelf = self; self.block = ^{ dispatch_async(dispatch_get_global_queue(0,0),^{ [NSThread sleepForTimeInterval:1]; NSLog(@"%@",weakSelf); }); return self; };
- 循環引用的分類
- 父子對象關系
classParent{ var name:String var child: Child? init(name: String){ self.name = name } } class Child{ var name: String weak var parent: Parent! init(name:String, parent: Parent){ self.name = name self.parent = parent } }
-
- 當block和閉包包含在類的成員變量中
> 閉包和block是獨立的內存對象,會retain它們所引用的對象
> 有一個類中的block恰好引用這個類的屬性或方法,可能產生循環引用
_weak typeof(self) weakSelf = self; self.block = ^{ [weakSelf description]; };
-
- GCD: dispatch_async
> dispatch_async() 閉包會強引用self,但是實例化的self不會引用閉包。所以self會被釋放,循環引用不會產生
> 不能使用weakSelf,對象的生命周期結束早於閉包結束,然後weakSelf會被釋放
循環引用 && weak strong