慢慢学会用block

来源:互联网 发布:可擦编程只读存储器 编辑:程序博客网 时间:2024/06/05 11:21


1.block的声明和定义

int(^)(int,int);//类似雨int,NSString *可以作为独立的参数

int(^block)(int);//变量block的声明,类型int(^)(int)

int(^block)(int)=^(int num){

retrun num+5;

}//变量block的定义





示例代码:

类1中实现如下方法

typedef  void (^ block1)(NSString *) ;typedef  void (^ block2)(int) ;-(void)aa:(block1)block1 bb:(block2)block2{    NSLog(@"begin");        block1(@"sss");//    block2(333);        NSLog(@"end");    }

控制器中实现如下的操作:

@property(nonatomic,strong)NSString *name;    blockController *vc=[[blockController alloc] init];    [vc aa:^(NSString * str) {        NSLog(@"%@",str);        self.name=str;    } bb:^(int num) {        NSLog(@"%d",num);    }];    NSLog(@"%@",self.name);

我们利用block实现的功能

实现两个类之间的信息交换.

1.block是在类1中的属性,在类1中执行,但是他的定义是在类2中.这个定义过程可以理解为将类2中的代码(包括类2的属性),搬到类1中去执行.这样类1就可以操作类2里面的东西了.

2.类1中的参数可以由类1赋值给block,这样在定义代码块的时候,我们就可以在类2中使用类1的参数,也就是所我们通过代码块让两个类有了交集,变得更像是一个类.

他的功能和回掉函数是一样的.但是比回掉函数更加的灵活.

回掉函数就是类1 把自己和自己的方法作为参数,通过类2的方法传递给类2,然后在类2中使用perform 方法执行类1中的对应方法.

3.block块会对里面的对象有强引用的效果,这有可能导致里面的self对象不能被释放(例如类1引用着类2,而block在类2中有被强引用着)

做法就是 __weak 类1 *weakSel=self;这样可以有效的解决循环引用的问题

4.还有一种情况可能会发生,就是我们使用了weakself,但是在bolck执行之前我们weakself释放了,这时候不会出现内存泄漏的错误,weakself会变成nil




.




0 0
原创粉丝点击