zoukankan      html  css  js  c++  java
  • 【iOS】block的使用

    Block 是iOS在4.0之后新增的程式语法,一般用于回调方法,功能上和delegate类似。本文将讲解block的几种常见的使用方法,当然,block中最值得注意的还是它的内存管理,我将在《》中讲到。

    环境信息:

    Mac OS X 10.9.5

    Xcode 5.1.1

    IOS 7.1

    正文:

    为什么要使用block?

    1. 可代替delegate完成回调,而不需要像delegate那样繁琐

    2. 在某些方面,可代替selector(如NSNotificationCenter在addObserver的时候,可以使用block,而不用单独定义方法)

    3. 延长对象的生命周期(block会自动持有对象,这将在《》中讲到)

    4. 提高代码的复用性和可读性

    block结构

    block的结构和C语言的函数指针结构类似,只是将函数指针的*换成了^

    block结构示意图

    block结构示意图

    如何使用?

    一、直接在方法中定义

    1. 无返回值无参数

    定义:

    
    void (^block) (void);
    
    

    赋值:

    
    block = ^{
    
        NSLog(@"block的内容");
    };
    
    

    调用:

    
    block();
    
    

    2. 有返回值有参数

    定义:

    
    int (^block)(int a);
    
    

    赋值:

    
    int (^block)(int a) = ^int(int a) {
    
        return a > 0 ? a : -a;
    };
    
    

    调用:

    
    NSLog(@"%d", block(-10));
    
    

    二、将block定义为属性

    定义:

    
    @property (nonatomic, copy) int (^block)(int a);
    
    

    赋值:

    
    Class *object = [[Class alloc] init];
    object.block = ^int (int a, int b) {
    
        return a > b ? a : b;
    };
    
    

    调用:

    调用将会在Class内部进行,所以这里使用到的self是指上面的object对象。调用之前,最好先判断对象是否给block赋值,如果block为nil,调用block会导致程序崩溃。

    
    if (_block) {
    
        self.block(10);
    }
    
    

    三、在方法中将block作为参数传入

    着这种用法中,我们通常会使用typedef为block取一个别名

    定义:

    
    typedef void(^Block)(int a);
    - (void)nslogParameterWithBlock:(Block)block {
    
        if (block) {
            block(10);
        }
    }
    
    

    赋值并调用:

    
    [object nslogParameterWithBlock:^(int a) {  
        
         NSLog(@"%d", a);
    }];
    
    

    总结:

    block使用方便,在项目中,合适的使用block也是你的代码看起来高端大气上档次,但是block的内存管理确实是一项非常重要也非常容易出错的地方,稍不注意便会造成内存泄露,所以,在使用block的时候,也要小心。

  • 相关阅读:
    网卡工作状态检测
    Soap/Web Service执行效率的思考
    Soap/Web Service执行效率的思考
    判断一个字符是否为汉字的最佳方法[转]
    Kafka数据可靠性深度解读
    HTTP 5XX代码理解
    图解:原来这就是网络
    架构设计原则
    Kafka
    Nginx 之 proxy_pass详解
  • 原文地址:https://www.cnblogs.com/yujidewu/p/5740965.html
Copyright © 2011-2022 走看看