IOS学习之block代码块
来源:互联网 发布:js获取对象的key 编辑:程序博客网 时间:2024/05/14 00:46
前言:
block这个名词对于做一般开发者来说可能会觉得稀奇古怪而非常陌生,但是对于iOS工程师来说,在整个开发中到处都是它的影子,今天一大早觉得在假期学习一下它,对明年的iOS开发工作做个准备,突然有点找回当年即将毕业时的最后一个春节假期的感觉,今天基于最近使用的角度来学习总结一下block。
什么是Block?
block是对象,它封装了一段代码,这段代码可以在任何时候执行。block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似,但是有区别:block是
inline
的,并且它对局部变量是只读的,^是block语法的标识。
声明block
第一种方式:用typedef定义一个block类型
typedef void (^Sucess)(NSString*);//用typedef定义一个block类型@property (nonatomic,copy) Sucess myBlock;
第二种方式:也可以通过标准的block函数体
@property (nonatomic,copy) void(^myBlock)(NSString*);
完整的block: NSString* (^callBack) (NSString *)
第一个参数:block返回值
第二个参数:block名字
第三个参数:block回调参数
NSString* (^callBack) (NSString *) =^(NSString *string){ NSMutableString * tempString=[[NSMutableString alloc]initWithString:@"I wanna to know "]; return [tempString stringByAppendingString:string]; } ; NSString *result=callBack(@"who is lcj ?"); NSLog(@"result ----> %@",result);
block访问变量
int num=0; int (^plus) (int ,int )=^(int a,int b) { num=a+b; return num; }; int finalNum=plus(5,6); NSLog(@"finalNum--->%d",finalNum);
比如上面这种方式是编译不通过的,block可以访问局部变量,但是不能修改。如果要修改就要加关键字:__block,修改后如下
__block int num=0; int (^plus) (int ,int )=^(int a,int b) { num=a+b; return num; }; int finalNum=plus(5,6); NSLog(@"finalNum--->%d",finalNum);
block循环引用
循环引用就是当self 拥有一个block的时候,在block 又调用self的方法。形成你中有我,我中有你,谁都无法将谁释放的困局。举例说明:
在block中处理viewController的全局变量str
void(^dealString)(void)=^{ self.str=@"who is lcj ?"; }; dealString();
如何解决?使用weakSelf,换言之类似Android中的弱引用
__weak typeof (self) weakSelf = self;
上面的修改成下面这种方式就可以解决循环引用问题
__weak typeof (self) weakSelf = self; void(^dealString)(void)=^{ weakSelf.str=@"who is lcj ?"; }; dealString();
总结:
今天大致总结了最近在开发中使用block的几个心得体会,后续更多block的高级使用再做总结。
0 0
- IOS学习之block代码块
- IOS学习之block代码块
- IOS学习之block代码块
- IOS学习之block代码块
- IOS学习之block代码块
- iOS 代码块Block
- iOS block代码块
- iOS代码块Block
- 学习笔记之 Block代码块
- 黑马程序员--IOS学习笔记(代码块Block总结)
- IOS学习第六篇——代码块(block)
- [ios开发基础之]代码块 ——block
- ww笔记-iOS之代码块(block)的使用
- iOS之Block代码块的定义及使用
- iOS 多界面传值之--Block(代码块)传值
- IOS开发之路-Objective-C 代码块(Block)-block计算器的实现
- IOS学习之代码块和变量
- IOS Block 代码块使用 (一)
- 累.....
- unity3d 快速拼ui工具 psd2ugui
- bowerrc报错
- poj1328
- 表单重复提交的问题
- IOS学习之block代码块
- 编译android版本openssl
- 深度优先——遍历Linux文件系统
- Zabbix解决中文乱码问题
- Spring的基本特征和配置
- spring websocket的应用
- RecyclerView的Itme多布局与Itme的点击事件
- Mahout学习之Mahout简介、安装、配置、入门程序测试
- Java 创建线程的方式