您的位置:首页 > 移动开发 > IOS开发

ios block

2016-03-04 17:16 381 查看

block 被Object-C看成一个对象,它封装了一段代码,这段代码可以在任何时候执行,提高程序的阅读性和复用性,相当于C语言中的指针,是一种方法回调机制。是对C语言的扩展,用来实现匿名内部函数的特性,可以实现函数的嵌套,访问函数内部变量。

在类中定义一个block变量,就像定义一个函数。block定义在函数内部,可以把它当作私有函数,定义在函数外部,其实就是文件级别的全局变量 。

Block 可以作为函数参数或者函数返回值,而其本身也可以带输入参数或返回值。

普通定义语法
int (^myBlock)(int a,int b)=^(int a,int b){
return a+b;
};
调用
int c=myBlock(3,4);

它对局部变量是只读的,不可以修改,只有添加__block 或 static 修饰,才可以修改

int a=10;
void (^myBlock)(int)=^(int num)
{
a=11;//not work

};
此处不能修改是在编译期间确定,编译器在编译时把a 的值复制到block中作为一个新的变量,这时就是函数中的值传递,此时如果修改就要添加 __block 或者 static

对于非ARC下, 为了防止循环引用, 我们使用__block来修饰在Block中使用的对象:

对于ARC下, 为了防止循环引用, 我们使用__weak来修饰在Block中使用的对象。ARC中,Block中如果引用了__strong修饰符的自动变量,则相当于Block对该变量的引用计数+1

NSString *_string;

_block = ^(){

NSLog(@string %@, _string);

};

这里的_string相当于是self->_string;那么block是会对内部的对象进行一次retain。也就是说,self会被retain一次。当self释放的时候,需要block释放后才会对self进行释放,但是block的释放又需要等self的dealloc中才会释放。如此一来变形成了循环引用,导致内存泄露。

修改方案

__block ViewController *controller = self;

_block = ^(){

NSLog(@string %@, controller->_string);

};

block 作为函数参数的使用

typedef void (^MyBlock)(NSString *showTest)//定义block 类型,名字为myBlock

@property(nonatomic,copy)MyBlock mblock; //属性

-(void)returnTest:(MyBlock)block;//block 作为参数使用

下面一个简单的传值操作

.h 文件定义

typedefvoid (^myBlock)(int a,int
b,int c,int d);

@interface ViewController :UIViewController

-(void)loadFinished:(myBlock)block value1:(int)x value2:(int)y;

@property (strong,nonatomic)myBlock
myblock;

@end

.m 文件函数实现部分

-(void)loadFinished:(myBlock)block value1:(int)x value2:(int)y;
{
self.myblock = [blockcopy];
self.myblock(x+y,x-y,x*y,x/y);
}

此为调用部分

self.m_viewctrl = [[ViewControlleralloc]
init];

//两种 方法实现block
// void (^myBlock)(int a,int b,int c,int d)=^(int a,int b,int c,int d)
// {
// NSLog(@"\n a = 3\n b = 2\n那么: \n a+b = %d \n a-b = %d \n a*b = %d\n a/b = %d\n",a,b,c,d);
// };
-------------
myBlock mblock=^(int a,int b,int
c,int d)
{
NSLog(@"\n a = 3\n b = 2\n那么: \n a+b = %d \n a-b = %d \n a*b = %d\n a/b
= %d\n",a,b,c,d);
};
[self.m_viewctrlloadFinished:mblock
value1:3value2:2];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: