block的简单说明
block的用处可以代替CALLback函数,但是只适用于少量的CALLback,如果多的话最好使用代理。
block的语法声明
返回类型 声明block函数 设置参数
void (^ block) (int a,int b)= ^ void (int a,int b)
{
};
这样声明的BLOCK一般用于内部函数是用
block的调用
block(1,12);
声明返回加法结果的block
int (^ sumBlock)(int a,int b)=^ int (int,int)
{
return a+b;
};
int c=sumBlock(1,2);
作为callback函数是用
如果作为CLASS A 的callback函数,就声明block在class a类里面
typedef void (^ block1)(NSString * name);
(1)使用方法传递block函数
一般block函数不用在传递的参数内,所以要copy一份,用于全局,
class a类声明一个函数
-(void)testBlock:(block1)block;
copy是用BLOCKCOPY()
释放是用BLOCKRELEASE()
例子:
在 class b中
classA( 实例对象)
[classA testBlock:(^ void)(NSString * name)
{
nslog(@“%@“,name);
}];
(2)是用属性进行返回调用
@property (nonatomic,copy) block1 block;
注意一定要使用copy使用,因为block创建是在栈上,不是堆上。
例子:
在 class b中
classA( 实例对象)
block1 blockTest=:(^ void)(NSString * name)
{
nslog(@“%@“,name);
}];
classA.block=blockTest;
(3)直接是用内敛函数。
-(void)testBlock:(void (^)(int a, int b))block;
在block的方法内部可以使用外部的变量,但是不可以修改,如果想修改就要添加__block 标识符
在block的内部会自动保存一份自己是用外部变量的引用技术。
比如是调用self.name就会出现循环引用问题
要这样写
__block classA blockSelf=self;
void (^ block )(NSString *name)=^ void (NSString * name)
{
blockSelf.name=name;
};