Block
2016-03-21 09:49
246 查看
Block 是一个对象 它封装了一段代码,这段代码可以在任何时候执行。block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。
左右声明 右面实现
//块语法
无返回值 无参数类型
//void 返回值类型
//(^myBlock)
变量名
//前面声明
//右面实现 ^()
放参数类型
void (^myBlock)() = ^(){
};
myBlock();
//无返回值类型
有参数
void (^myBlock)(NSString *)=^(NSString * str){
NSLog(@"str===%@",str);
};
myBlock(@"wasd");
//无返回值类型
多参数
void (^myBlock)(NSString *,int)=^(NSString * str,int a){
NSLog(@"%@,%d",str,a);
};
myBlock(@"wasda",5);
//有返回值类型
带参数
int (^myBlock)(int) = ^(int a){
return a;
};
int b = myBlock(5);
block 属性声明
typedef void (^ReturnValueBlock) (id returnValue);
@property (strong,
nonatomic) ReturnValueBlock returnBlock;
// 传入交互的Block块
-(void) setBlockWithReturnBlock: (ReturnValueBlock) returnBlock;
实现部分
-(void) setBlockWithReturnBlock: (ReturnValueBlock) returnBlock
{
//将传递的block 接收属性block 这样调用的时候就会响应对应的方法
_returnBlock = returnBlock;
}
//调用
block响应就会找到对应的方法实现 方法传值
self.returnBlock(array);
MyorderViewModel * model = [[MyorderViewModel
alloc]
init];
[model setBlockWithReturnBlock:^(id returnValue) {
}
属性传值
model.returnBlock =
^(id returnValue) {
}
__block __weak
1.__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。
2.__weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。
3.__block对象可以在block中被重新赋值,__weak不可以。
block 内部使用外部变量的值 就是拷贝一份 这样在block内部修改值 是无法改变外部变量的值 (因为拷贝更换了地址)所以添加__block
__block声明的局部变量 可以在block中修改
循环引用
当砸在block内部使用属性的时候 block 就会对self进行强引用 如果blcok 是self的一个属性的时候 这样就会造成 self引用block block引用self 这样就造成了循环引用的问题
解决方法
ARC环境下
MRC环境下:解决方式与上述基本一致,只不过将__weak关键字换成__block即可,这样的意思是告诉block:小子,不要在内部对self进行retain了!
左右声明 右面实现
//块语法
无返回值 无参数类型
//void 返回值类型
//(^myBlock)
变量名
//前面声明
//右面实现 ^()
放参数类型
void (^myBlock)() = ^(){
};
myBlock();
//无返回值类型
有参数
void (^myBlock)(NSString *)=^(NSString * str){
NSLog(@"str===%@",str);
};
myBlock(@"wasd");
//无返回值类型
多参数
void (^myBlock)(NSString *,int)=^(NSString * str,int a){
NSLog(@"%@,%d",str,a);
};
myBlock(@"wasda",5);
//有返回值类型
带参数
int (^myBlock)(int) = ^(int a){
return a;
};
int b = myBlock(5);
block 属性声明
typedef void (^ReturnValueBlock) (id returnValue);
@property (strong,
nonatomic) ReturnValueBlock returnBlock;
// 传入交互的Block块
-(void) setBlockWithReturnBlock: (ReturnValueBlock) returnBlock;
实现部分
-(void) setBlockWithReturnBlock: (ReturnValueBlock) returnBlock
{
//将传递的block 接收属性block 这样调用的时候就会响应对应的方法
_returnBlock = returnBlock;
}
//调用
block响应就会找到对应的方法实现 方法传值
self.returnBlock(array);
MyorderViewModel * model = [[MyorderViewModel
alloc]
init];
[model setBlockWithReturnBlock:^(id returnValue) {
}
属性传值
model.returnBlock =
^(id returnValue) {
}
__block __weak
1.__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。
2.__weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。
3.__block对象可以在block中被重新赋值,__weak不可以。
block 内部使用外部变量的值 就是拷贝一份 这样在block内部修改值 是无法改变外部变量的值 (因为拷贝更换了地址)所以添加__block
__block声明的局部变量 可以在block中修改
循环引用
当砸在block内部使用属性的时候 block 就会对self进行强引用 如果blcok 是self的一个属性的时候 这样就会造成 self引用block block引用self 这样就造成了循环引用的问题
解决方法
ARC环境下
__weak
typeof
(self) weakSelf = self;
MRC环境下:解决方式与上述基本一致,只不过将__weak关键字换成__block即可,这样的意思是告诉block:小子,不要在内部对self进行retain了!
相关文章推荐
- shader学习
- Linux基础优化
- 【转】渗透测试工具sqlmap基础教程
- 安装activiti流程设计器插件失败最终解决方案
- 关于URI
- Android RSA加密解密
- xcode环境变量设置(转载)
- apk,task,android:process与android:sharedUserId的区别
- Gradle依赖的统一管理
- iOS中文件的上传下载功能
- React传递props
- PHP PSR-4 基本代码规范(中文版)
- .net平台 基于 XMPP协议的即时消息服务端简单实现
- RxJava例子
- 网络通信中的错误处理(记录)
- 获取手机参数
- 夺命雷公狗---DEDECMS----15dedecms首页栏目列表页导航部分完成
- HTML—个人简历
- NSPredicate
- listView分割线