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];
相关文章推荐
- iOS Path 路径 绘制 详解
- iOS7以后,我们如何统计和跟踪用户
- iOS IQKeyBoardManager 引起的界面漂移bug 解决
- 使用quartus和NIOS过程中遇到的问题和解决方法
- 使用Cordova编写 iOS应用
- nRF iOS项目(github开源项目)编译运行相关问题解决方案
- iOS 竖屏和横屏的切换
- iOS开发之静态库-基本概念
- iOS消息推送
- ios第三方库Masonry学习资料(链接)
- iOS使用RSA进行加解密
- iOS帐号、证书之漫谈(五)—— 申请企业开发帐号
- iOS帐号证书之漫谈(二)—— 申请邓白氏码
- iOS帐号、证书之漫谈(一)
- iOS 上传应用证书出现错误
- 自定义圆形进度条,绘制进度条
- IOS开发中将中文转换为拼音首字母输出
- ios 版本更新功能
- iOS开发系列--音频播放、录音、视频播放、拍照、视频录制
- iOS获取当前地理位置文本