iOS 常見內存泄漏--項目實遇

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];
相關文章
相關標籤/搜索