IOS 學習---block塊的內存管理,及解決循環引用的方法

在MRC環境下: this

block對局部變量的影響:spa

    

         使用局部變量:ablock塊中,爲了在block中可以使用這個變量,將a拷貝放到常量區  域 code

    int a = 10;  orm

    若是訪問局部對象,爲了在block中可以使用這個對象,引用計數值加一對象

    若是使用__block修飾,計數值則不加一it

    __block NSMutableArray *array = [[NSMutableArray alloc]initWithObjects:@"張三",@"李四",@"王五", nil];  //1
    
    [button addTapBlcok:^(UIButton *button){
        
//        a = 90;
        
        NSString *str = [array objectAtIndex:2];
        NSLog(@"str:%@",str);
    }];
    
    [array release];

block對全局變量的影響table

   block在訪問全局變量、方法的時候,會將這個變量對應的對象計數值加一class

   block -> self -> self.view -> button -> block    test

   解決方式:使用__block修飾self  變量

   總結:在MRC環境中__block的做用:(1)能夠在block中修改變量值  2block內部訪問屬性的時候,能夠使用__block修飾,避免計數值加一(解決循環引用問題


    MyButton *button = [MyButton buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(90, 90, 90, 90);
    button.backgroundColor = [UIColor redColor];
    [self.view addSubview:button];
    
    __block SecondViewController *this = self;
    
    [button addTapBlcok:^(UIButton *button){
    
//        this->_index = 20;
        
//        NSLog(@"%ld",this->_index);
        
        [this test];
        
    }];
    
}

- (void)test {

    NSLog(@"test");
}

在ARC環境下:

__block:(1)可讓局部變量在block中修改數據

//在ARC環境中
    //__block:(1)可讓局部變量在block中修改數據
    __block int a = 9;
    
    [button addTapBlcok:^(UIButton *button){
    
        a = 2;
        NSLog(@"a:%d",a);
        
    }];


解決循環引用問題

使用__weak修飾self

//在ARC環境中的解決方法:
//    strong  weak
    __weak SecondViewController *weakThis = self;
    
    [button addTapBlcok:^(UIButton *button){
    
        //在調用方法的時候,解決了循環引用問題
//        [weakThis test];
        
        //weakThis沒法訪問當前的屬性
        __strong SecondViewController *strongThis = weakThis;
        strongThis->_index = 20;
        NSLog(@"%ld",strongThis->_index);
        
        [strongThis test];
        
    }];

}

- (void)test {
    NSLog(@"test");
}
相關文章
相關標籤/搜索