美文网首页iOS-block程序员iOS进阶指南
Day.03.11 Block修饰符 循环引用

Day.03.11 Block修饰符 循环引用

作者: 挂树上的骷髅怪 | 来源:发表于2016-03-11 20:42 被阅读81次

ViewController.m

#import "ViewController.h"

@interface ViewController ()

@property (nonatomic,strong) UIAlertController *alert;


@end

@implementation ViewController

int b = 10;//全局变量


- (IBAction)alert:(UIButton *)sender {
    
    //1.创建
    _alert = [UIAlertController alertControllerWithTitle:@"设置" message:@"是否要更改屏幕颜色" preferredStyle:UIAlertControllerStyleAlert];
    
    UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
        
        
    }];
    
    /**
     *
     block持有self(ViewController):  --> 变为弱引用
     
     ARC中block在创建时,编译器会对block代码里的所有对象计数+1,相当于block持有了这些对象
     
     self持有了alert
     
     alert是viewController的属性
     
     alert持有block
     
     alert调用了方法(附有block)
     */
    
    //修饰符 类型名 变量名 = 赋值;
    
    __weak ViewController *weakSelf = self;//解决循环引用
    
    [_alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
        
        
        /**
         *  弱引用的self,在block中随时都会有被销毁,可能导致:
         在调用doSomeThing的时候self还存在,然后再调用doOtherThing的时候,self变成了nil
         为了避免这种情况,将__weak重新__strong.
         
         一般情况下,建议这么做,没有任何风险.
         */
        __strong ViewController *strongSelf = weakSelf;
        
        [[NSNotificationCenter defaultCenter]addObserver:strongSelf selector:@selector(blockSpecifier) name:@"" object:nil];
        
        
    }];
    
    [_alert addAction:cancel];
    
    [self presentViewController:_alert animated:YES completion:nil];
    
    
    
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self blockSpecifier];
    
    /*—————————————— Block的循环引用 —————————————————————————————————————————————————————————*/
    
    
    
    
}

- (void)blockSpecifier{
    
    /*—————————————— Block修饰符 —————————————————————————————————————————————————————————————*/
    
    //    __strong : 强引用 -> 个数决定对象的生命
    
    //    __weak : 弱引用
    
    //    __block : 在block代码块中修改局部变量的值,则使用__block修饰符
    
    __block int a = 10;//局部变量
    
    //定义
    void(^block)(void) = ^(){
        
        b = 100;
        
        a = 100;
        
    };
    
    //调用
    block();
    
    NSLog(@"%d",a);
    NSLog(@"%d",b);
    
}


@end

屏幕快照 2016-03-11 下午8.40.39.png 屏幕快照 2016-03-11 下午8.40.49.png

相关文章

  • Day.03.11 Block修饰符 循环引用

    ViewController.m

  • Block

    Block介绍 截获变量 __block修饰符 Block的内存管理 Block的循环引用 一、Block介绍 1...

  • iOS 面试全方位剖析 -- Block篇

    block 介绍 截获变量 __block修饰符 Block的内存管理 Block的循环引用 为什么 weakSe...

  • iOS-Block知识点整理

    block 介绍 截获变量 __block修饰符 Block的内存管理 Block的循环引用 为什么 weakSe...

  • iOS Block

    什么是Block 截获变量 __block修饰符 内存管理 循环引用 什么是Block? 将函数及其执行上下文封装...

  • iOS 开发 Block 原理分析

    前言 无论在面试还是在工作中,总会碰到 block 是什么?block 循环引用怎么办?block 修饰符使用什么...

  • Block笔记(六)

    Block循环引用 如果在block中使用附有__strong修饰符的对象类型自动变量,那么当Block从栈复制到...

  • Block循环引用

    Block的循环引用 如果在Block中使用_strong修饰符的对象类型自动变量,当block从栈复制到堆时,...

  • Block循环引用的四种解决方案

    Block常见的循环引用模型 以下是常见的Block循环引用模型,self引用block,block引用self,...

  • __block与__weak的真正区别

    block下循环引用的问题 __block本身并不能避免循环引用,避免循环引用需要在block内部把__block...

网友评论

    本文标题:Day.03.11 Block修饰符 循环引用

    本文链接:https://www.haomeiwen.com/subject/zxlxlttx.html