1. 程式人生 > >循環引用 && weak strong

循環引用 && weak strong

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;
};

  • 循環引用的分類
    • 父子對象關系
class
Parent{ 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