1.在使用核心動畫的時候,若是使用了核心動畫的delegate,那麼就會形成循環引用,目前解決辦法以下:https://www.jianshu.com/p/39462a71cf40動畫
補充:在新建的類中聲明一下核心動畫的協議會解決出現的黃色警告問題。atom
2.使用block一個常見的循環引用,舉例以下:spa
建立屬性變量code
@property (nonatomic,copy)NSString *page;
建立對象對象
CustomView *cView = [[CustomView alloc]init]; cView.backgroundColor = [UIColor redColor]; cView.frame = CGRectMake(100, 100, 100, 100); cView.block = ^{ self.page = @"123"; }; [self.view addSubview:cView];
我建立了一個局部的UI控件,點擊以後對page進行賦值。從表面上來看,並無構成循環引用,只有cView引用self,self沒有再次引用cView。可是須要注意一點,就是[self.view addSubview:cView],這句話會對cView進行retain,也就是引用計數會加1,self引用了cView,cView在block裏面引用了self,致使構成循環引用。解決方法就是添加__weak typeof(self) weakSelf = self解決blog
3. block常見的另外一個的循環引用,舉例以下:get
建立實例變量it
@interface FirstViewController () { NSString *_page; } @end
建立對象class
CustomView *cView = [[CustomView alloc]init]; cView.backgroundColor = [UIColor redColor]; cView.frame = CGRectMake(100, 100, 100, 100); cView.block = ^{ _page = @"123"; }; [self.view addSubview:cView];
在Block裏面,能不用實例變量就別使用實例變量,不管是這樣使用@property (nonatomic,copy)NSString *page定義所造成的實例變量,仍是使用本身建立的實例變量。這樣使用一樣會造成循環引用。簡單的解決辦法是:若是是屬性變量,直接將下劃線改爲self,而後常規寫法__weak。複雜點的解決方法以下:變量
CustomView *cView = [[CustomView alloc]init]; cView.backgroundColor = [UIColor redColor]; cView.frame = CGRectMake(100, 100, 100, 100); __weak typeof(self) weakSelf = self; cView.block = ^{ __strong typeof(weakSelf) strongSelf = weakSelf; strongSelf->_page = @"123"; }; [self.view addSubview:cView];