zoukankan      html  css  js  c++  java
  • iOS block 基本用法及代替代理

    主要内容:

    • block基本声明格式
    • block访问区域变量
    • block代替代理

    block基本声明格式:

    ^(传入的参数){具体代码};  
    

    注: Block实体开头是“^”,接着是由小括号所包起来的参数列(比如 int a, int b, int c),行为主体由大括号包起来,专有名字叫做block literal。行为主体可以用return回传值,类型会被compiler自动辨别。如果没有参数列要写成: ^(void)。
    最简单的例子:

    ^(int a){return a*a};  
    

    简单调用例子:

    int result = ^(int a){return a*a}(5);
    NSLog(@"%d", result);
    //好像这个例子没什么用,个人不知道这样写的意义在哪。
    

    Block Pointer(Block指针)

    //声明一个square的Block Pointer,其所指向的Block有一个int输入和int输出  
    int (^square)(int);  
    //将Block实体指定给square  
    square = ^(int a){ return a*a ; };  
    //调用方法,感觉是是不是很像function的用法?  
    int result = square(5);  
    NSLog(@"%d", result); 
    

    Block 还可以当作方法传给参数,如:

    -(void)objcMethod:(int(^)(int))square;  //square参数的类型是int(^)(int) 
    

    存取变量:
    在同一个代码块里面,Block是可以读取Block之外的变量的,如:

    {  
        int outN = 8;  
        int (^myPtr)(int) = ^(int a){ return outN + a;};  
        //block里面可以读取同一类型的outN的值  
        int result = myPtr(3);  // result is 11  
        NSLog(@"result=%d", result);  
    }  
    

    当变量为简单类型时,Block是直接copy当前变量的,而不是引用,如:

    {  
        int outN = 8;  
        int (^myPtr)(int) = ^(int a){ return outN + a;};  
        //block里面可以读取同一类型的outN的值  
        //改变outN 的值
        outN = 5;
        int result = myPtr(3);  // result is 11  
        NSLog(@"result=%d", result);  
    }  
    

    注:如果变量被static修饰过,会有一样的效果
    当变量为指针时,如:

    {  
        NSMutableString string = [[NSMutableString alloc]initWithString:@"aaaa"];  
        int (^myPtr)(int) = ^(int a){[string setString:@"changed!"] return a + a;};  
        //block里面可以读取同一类型的outN的值  
        int result = myPtr(3);  // result is 11  
        NSLog(@"string =%@", string);// string =changed   
    }
    

    Block variable(Block类型变量)
    在某个变量前面如果加上修饰字“__block”的话(注意,block前面有两个下划线),这个变量就称作block variable。

    那么在block里面就可以任意修改此变量的值,如:

    {  
        int outN = 8;  
        int (^myPtr)(int) = ^(int a){ return outN+= a;};  
        //block里面可以读取同一类型的outN的值  
        int result = myPtr(3);  // result is 11  
        NSLog(@"outN=%d", outN);  //outN=11
    }  
    

    用Block代替代理
    假如controller 的名字为: MyUIViewController
    1).声明一个block(假设无返回值)

    typedef void(^onSearch)(NSString *text);
    

    2).在controller(事件触发源的地方)定义block

    //定义成员属性
    @property(nonatomic)onSearch onSearchBlock;
    //添加setter方法
    -(void)setOnSearchBlock:(void(^)(NSString *searchText)) block; 
    

    3).在对应的m文件里面实现setter方法

    -(void)setOnSearchBlock:(void(^)(NSString *searchText)) block{
        if (block) {
            self.onSearchBlock = block;
        }
    }
    

    4)在controller 中使用block实现回调,如:

    -(void)searchHandler:(id)sender {
           if (self.searchBlock) {
                    //这里传具体的参数,要查询的文本
                    self.searchBlock(@"your search keyword")
            }
    }
    

    5)在其它地方,接收传过来的参数,如:

    MyUIViewController *vc = [MyUIViewController new];
    [vc setOnSearchBlock:^(NSString *searchText) {
             NSLog(@"get search keyword")       
    }]
  • 相关阅读:
    第五篇:在SOUI中使用XML布局属性指引(pos, offset, pos2type)
    第四篇:SOUI资源文件组织
    第三篇:用SOUI能做什么?
    第二篇:SOUI源码的获取及编译
    第一篇:SOUI是什么?
    BuildFilePath 及打开文件对话框
    Java的synchronized关键字:同步机制总结
    Synchronized Methods
    java synchronized详解
    深拷贝与浅拷贝探析
  • 原文地址:https://www.cnblogs.com/liaolijun/p/4750089.html
Copyright © 2011-2022 走看看