IOS开发之block块详细分析

来源:互联网 发布:酷狗铃声截取软件 编辑:程序博客网 时间:2024/06/06 06:07

一.定义一个block的过程

注明:A类(引用block的类)B类(声明block的类)

(1)声明一个block,如下:

B类

typedef void (^MyBlock)(NSString *); 

(2)类里面定义block对象,如下:

B类

MyBlock my;(成员变量)

@property (nonatomic , strong) MyBlock myBlock;(属性)


(3)在block类里面声明一个含有block的方法,作用是在引用block的类里面调用block块,方面后面回调block里面的方法

B类

-(id)initwithBlock:(MyBlock)str; 


A类

B *b = [[B alloc] initwithBlock:Block_copy(^(NSString *str){  

       NSLog(@"%@",str);        

      labShow.text = str;  

})]; 

(4)触发block执行,执行后回调A类里面的方法

只要想办法执行block就行了,因为只有触发block才能实现方法的回调,下面分集中方法来触发

《1》如果B类里面触发,例如在B类里面声明一个按钮,点击按钮就触发block

-(id)initwithBlock:(MyBlock)str    {        self = [super init];        if(self)        {               _myBlock = str;        }        return self;    }  


-(IBAction)back:(id)sender    {        NSString* s = txtView.text;        if(_myBlock)        {            _myBlock(s);        }        [self.navigationController popViewControllerAnimated:YES];    }  

这样的话就出发了然后就去回调A类的含有block的方法了

《2》在A类里面调用B类的方法,B类直接声明类方法,方法里面触发block

A类

- (IBAction)btnClick:(UIButton *)sender{    CGRect temp = CGRectMake(_btnOutlet.frame.origin.x, _btnOutlet.frame.origin.y, _btnOutlet.frame.size.width+50, _btnOutlet.frame.size.height+20);        [B ChangeRootViewBtnRect:temp blockcompletion:^(UIColor *colorEnum) {         /*函数回调 当block执行时就会回到这里*/        _btnOutlet.backgroundColor = colorEnum;    }];}

B类

+ (void)ChangeRootViewBtnRect:(CGRect)rect blockcompletion:(Changcolor)Changcolorblock{    UIColor *temp = [UIColor greenColor];    Changcolorblock(temp); //执行block }

《3》在B类里面不声明含有block的方法直接声明block属性,直接声明block对象在对象里面添加实现的功能

B类

@property (nonatomic , strong) MyBlock my;(属性)

A类

A *block = [[A alloc] init];    block.testBlock = ^()    {        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Block学习" message:@"测试成功" delegate:self cancelButtonTitle:@"取消吧" otherButtonTitles:@"OK", nil];        [alert show];            };    [block StartBlock];

B类

在B.h

- (void)StartBlock;

在B.m

- (void)StartBlock{    [self performSelector:@selector(test) withObject:nil afterDelay:2.0];}- (void)test{    if (_myBlock) {        _myBlock();    }}


总结:block实现过程就是调用block方法,触发block,然后回调block方法实现的内容




0 0
原创粉丝点击