iOS 成长之路

iOS block的基础语法

2018-07-05  本文已影响4人  奋拓达

Block的基本使用

Block概述

block是一个数据类型:int double float char ...
既然是一个数据类型,那么就可以声明这样的数据类型的变量,所以我们完全可以声明一个block类型的变量,
不同数据变量中可以存储不同的数据类型,那么block类型的变量中可以存储声明样的数据呢?

  1. Block是一个数据类型,所有我们可以声明一个block类型的变量
  2. Block类型的变量中专门存储1段代码,这段代码可以有参数 可以有返回值
  3. block的声明,虽然Block是用来存储一段代码的,但是一个block变量中并不是任意的1段代码都可以存进去的,有限定的,也就是说在声明block变量的时候保证这个block变量的代码段是否有参数,是否有返回值。一旦指定之后,这个block的变量中就只能存储这样的一段代码。
    声明一个block变量,返回值是void 参数是有个int类型的,这时候,这个block变量中的就只能存储无返回值的且有一个int参数的代码段。
  4. 声明block变量的语法格式: 返回值类型 (^block变量名称)(参数列表);
  5. 无参数书写形式:void (^myblock)(void);
  6. 有参数的书写形式:int (^ myblock)(int num1 ,int num2);

block变量的基本使用


int sum(int a, int b){
    return a + b;
}

void test(){
    
}

int main(int argc, const char * argv[]) {
    
    sum(10, 20);
    
    /**
     *  void    返回类型
     *  ^ caret 插入符号
     *  block1  变量名
     *  a, b    参数列表
     */
    
    // block1 变量的定义
    void (^block)(void) = ^void (void) {
        
        NSLog(@"我是一个块代码");
        
    };
    
    void (^ block1)(void) = ^(void) {
        
        NSLog(@"我是一个块代码");
    };
    
    // block调用
    block();
    block1();
    
    int (^ sum)(int, int) = ^ (int a, int b) {
        
        return a + b;
    };
    
    int result = sum(10, 20);
    NSLog(@"result : %d", result);

    return 0;
}

带参数的block变量类型的书写

int (^ myblock)(int num1 ,int num2) =  ^ int(int num1,int num2) {
    
    return num1 + num2;
};

int sum = myblock(10,20);
NSLog(@"sum=%d",sum);

使用block时需注意的问题

__block int a = 10;
NSLog(@"a 1: %p", &a);
    
void (^ block)(void) = ^(void) {
    // 它被这个block拷贝成了一个常量
    NSLog(@"a 2: %p", &a);
    a = 10;
};
    
block();

block数据类型起别名

@interface ViewController ()

@end

typedef int (^ MyBlocks) (int a, int b);

@implementation ViewController

- (void)testBlock:(MyBlocks)block
{
    block(10, 20);
}

- (void)viewDidLoad {
    
    [super viewDidLoad];

    MyBlocks block = ^(int a, int b) {
        return a + b;
    };
    
    block(10, 20);
    
    [self testBlock:^int(int a, int b) {
        return a + b;
    }];
    
}

Block的RetainCycle

当我们定义局部block时,它在内存中“栈”,它不会保留任何对象,因为它的生命周期出了方法就死亡了如果在块语句中,调用了一个局部变量,那么这个变量它会被认为是一个常量,是不可以被修改的,如果想修改,修饰符__block;全局、外部、静态变量.

一旦我们将block进行copy,意味着将这个block变量从栈拷贝到了堆中

a.如果在块中是一个局部的对象,那么这个block变量会将这个对象进行保留,防止这个对象提前释放。如若不想保留,添加__block修饰符

b.如果在块中是一个全局对象,那么这个block变量不会对这个对象进行保留,但会保留这个对象的拥有者,比如self

上一篇下一篇

猜你喜欢

热点阅读