• BLOCK用法传值


    ios4.0系统已开始支持block,在编程过程中,blocks被Obj-C看成是对象,它封装了一段代码,这段代码可以在任何时候执行。Blocks可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似,但是有区别:blocks是inline的,并且它对局部变量是只读的。

    下面是理论部分:

      1、block的定义

    // 声明和实现写在一起,就像变量的声明实现 int a = 10;
     2        int (^aBlock)(int, int) = ^(int num1, int num2) {
     3  
     4        return num1 * num2;
     5  
     6      };
     7 // 声明和实现分开,就像变量先声明后实现 int a;a = 10;
     8         int (^cBlock)(int,int);
     9         cBlock = ^(int num1,int num2)
    10         {
    11             return num1 * num2;
    12         };
    

      

    其中,定义了一个名字为aBlock的blocks对象,并携带了相关信息:

      1、aBlock 有两个形式参数,分别为int类型;

      2、aBlock 的返回值为int 类型;

      3、等式右边就是blocks的具体实现;

      4、^ 带边blocks声明和实现的标示(关键字);

          当然,你可以定义其他形式的block。e.g:无返回值,无形式参数等;

    void (^bBlock)() = ^()
    2         {
    3             int a = 10;
    4             printf("num = %d",a);
    5         };    
    

      

     2、blocks 访问权限

      blocks可以访问局部变量,但是不能修改。

     int a = 10;
    2         int (^dBlock)(int) = ^(int num)
    3         {
    4             a++;//not work!
    5             return num * a;
    6         };
    

      

     此处不能修改的原因是在编译期间确定的,编译器编译的时候把a的值复制到block作为一个新变量(假设是a‘ = 10),此时a'和a是没有关系的。

    这个地方就是函数中的值传递。如果要修改就要加关键字:__block或者static

      __block int a = 7;
    2         int (^dBlock)(int) = ^(int num)
    3         {
    4             a++;// work!
    5             return num * a;
    6         };
    

      

    3、block的调用

      block调用就像调用函数一样。e.g:

    int c = aBlock(10,10); <br>  bBlock();
    

      下边是在两个viewcontroller之间通过block传值

    MainView.h
    #import <UIKit/UIKit.h>
    
    @interface MainView : UIViewController
    {
        IBOutlet UIButton* btn;
        IBOutlet UILabel* labShow;
    }
    -(IBAction)push:(id)sender;
    @end
    
    MainView.m
     
    #import "MainView.h"
    #import "SecondView.h"
    
    @implementation MainView
    
    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    {
        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        if (self) {
        }
        return self;
    }
    
    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
    }
    
    #pragma mark - View lifecycle
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    }
    -(IBAction)push:(id)sender
    {
        SecondView *s = [[SecondView alloc] initwithBlock:Block_copy(^(NSString *str){
            NSLog(@"%@",str);
            labShow.text = str;
        })];
        [self.navigationController pushViewController:s  animated:YES];
        [s release];
    }
    - (void)viewDidUnload
    {
        [super viewDidUnload];
    }
    
    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    {
        return (interfaceOrientation == UIInterfaceOrientationPortrait);
    }
    
    @end
    

      Second.h

    #import <UIKit/UIKit.h>
    typedef void (^MyBlock)(NSString *);
    
    @interface SecondView : UIViewController
    {
        IBOutlet UITextField* txtView;
        MyBlock my;
    }
    -(IBAction)back:(id)sender;
    -(id)initwithBlock:(MyBlock)str;
    @end
    
    Second.m
     
    #import "SecondView.h"
    
    @implementation SecondView
    
    -(id)initwithBlock:(MyBlock)str
    {
        self = [super init];
        if(self)
        {   
            my = str;
        }
        return self;
    }
    -(IBAction)back:(id)sender
    {
        NSString* s = txtView.text;
        if(my)
        {
            my(s);
        }
        [self.navigationController popViewControllerAnimated:YES];
    }
    
    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
    }
    -(void)dealloc{
        Block_release(my);
        [super dealloc];
        
    }
    #pragma mark - View lifecycle
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    }
    
    - (void)viewDidUnload
    {
        [super viewDidUnload];
    }
    
    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    {
        return (interfaceOrientation == UIInterfaceOrientationPortrait);
    }
    
    @end
    

      

    [转载]iOS中使用block传值

    [转载]iOS中使用block传值

    [转载]iOS中使用block传值

  • 相关阅读:
    codeforces 686A A. Free Ice Cream(水题)
    bzoj-1192 [HNOI2006]鬼谷子的钱袋(水题)
    poj-3254 Corn Fields(状压dp)
    poj-1185 炮兵阵地(状压dp)
    Notepad++ 小技巧
    使用 notepad++ 编辑器在行首、行尾添加字符
    查看数据库中有大写的表
    Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '='
    expect
    shell数组
  • 原文地址:https://www.cnblogs.com/AbelChen1991/p/3671787.html
Copyright © 2020-2023  润新知