iOS开发——Block使用小结
Block语法看上去好像很特别,但它实际上是作为极普通的C语言源代码处理的。Block的实质,就是Objective-C的对象。
1、Block的语法
^ 返回值类型 参数列表 表达式
可省略返回值类型:^ 参数列表 表达式。省略返回值类型时,如果表达式中有return语句就使用该返回值的类型,如果表达式中没有return语句,就使用void类型。
再省略参数列表:^ 表达式。这个就是大家最熟知的记叙方式。
int val = 10;
void (^blk)(void) = ^{
printf("val = %d\n",val);
};
blk();
2、__block说明符
若想在Block语法的表达式中将值赋给在Block语法外声明的自动变量,需要在该自动变量上附加__block说明符。不然就会产生编译错误。
__block int val = 10;
void (^blk)(void) = ^{
val = 11;
};
blk();
printf("val = %d\n",val);
3、Block循环引用
先看看下面的源代码吧!
typedef void(^blk_t)(void);
@interface MyObject : NSObject{
blk_t blk_;
}
@end
@implementation MyObject
- (id)init {
self = [super init];
blk_ = ^{
NSLog(@"self = %@",self);
};
return self;
}
@end
MyObject类对象的Block类型成员变量blk_持有赋值为Block的强引用。即MyObject类对象持有Block。init实例方法中执行的Block语法使用持有__strong修饰符的id类型变量self。并且由于Block语法赋值在了成员变量blk_中,因此通过Block语法生成在栈上的Block此时由栈复制到堆,并持有所使用的self。self持有Block,Block持有self。这正是循环引用。
为避免循环引用,可声明附有__weak修饰符的变量,并将self赋值使用。
- (id)init {
self = [super init];
id __weak tmp = self;
blk_ = ^{
NSLog(@"self = %@",tmp);
};
return self;
}
iOS开发——Block使用小结的更多相关文章
- iOS开发--Block
iOS开发--Block 1.什么是Block,block 的作用 ui开发和网络常见功能实现回调,按钮的事件处理方法是回调方法以及网络下载后的回调处理 (1)按钮 target-action 一 ...
- iOS开发——Block详解
iOS开发--Block详解 1. Block是什么 代码块 匿名函数 闭包--能够读取其他函数内部变量的函数 函数变量 实现基于指针和函数指针 实现回调的机制 Block是一个非常有特色的语法,它可 ...
- ios开发 block语句块
ios开发 block语句块 1.block 理解为匿名函数 2.block变量的定义 //定义block变量,^表示定义block //技巧:函数名左右加括号,在函数名前面在加^ void (^bl ...
- IOS开发,知识点小结,ios开发中经常使用的宏定义总结
IOS开发,从应用跳转到用浏览器打开网页: [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http:// ...
- iOS开发-Block回调
关于Block之前有一篇文章已经写过一篇文章Object-C-代码块Block回顾,不过写的比较浅显,不能体现出Block在实际开发中的重要性,关于Block的基础知识,可以参考之前的博客.在实际开发 ...
- iOS开发Block的使用
Block 是从 iOS4引入的,在日常开发中,会经常用到Block.特别是在多线程中,Block的用处更广泛.而且,Block不仅可以接收参数,其本身也可以作为参数,因此,Block的功能非常强大. ...
- IOS开发 Block的学习
苹果公司正在大力推广Block块语法的使用,据说Block会迟早取代一般协议代理的使用. Block最大的作用是函数回调,简化代码. 在ios中,将blocks当成对象来处理,它封装了一段代码,这段代 ...
- iOS开发-block使用与多线程
Block Block封装了一段代码,可以在任何时候执行 Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值. 苹果官方建议尽量多用block.在多线程.异步任务.集合遍历. ...
- iOS开发——设备信息小结(未完待续...)
1.获取设备的信息 UIDevice *device = [[UIDevice alloc] init]; NSString *name = device.name; //获取设备所有者 ...
随机推荐
- day20 匿名函数,内置函数,面向过程编程
目录 有名函数 匿名函数 max() min() sorted map filter 内置函数 面向过程编程 有名函数 def f1(): print('my name is f1') f1() my ...
- zabbix监控自身为监控机(server)
Zabbix 监控主机 添加自身为被监控机 这里我的环境已经部署完毕(没有经验的小伙伴可以看我上一篇文章) 等待一会刷新如下页面 字体出现以下亮度就成功了
- MySQL主从宕机的解决方法
测试系统:centos6.5系统 测试环境IP地址划分: master: 192.168.80.130 slave:192.168.80.143 slave:192.168.80.146 首先模拟(M ...
- sudo日志审计
一般企业生产环境都会用跳板机把操作日志记录下来,不过有些公司内部的测试机可以用本机的sudo日志审计功能将执行的sudo命令保存日志. 为什么要使用sudo审计,因为可以通过sudo授权给普通用户执行 ...
- 循环语句第1种 LOOP ... END LOOP;
7)循环语句 --------第1种---------- LOOP ... END LOOP; declare n number(3) := 1; begin LOOP ...
- HDU 1350 Taxi Cab Scheme
Taxi Cab Scheme Time Limit: 10000ms Memory Limit: 32768KB This problem will be judged on HDU. Origin ...
- (转)Epoll模型详解
1. 内核中提高I/O性能的新方法epoll epoll是什么?按照man手册的说法:是为处理大批量句柄而作了改进的poll.要使用epoll只需要这三个系统调 用:epoll_create(2), ...
- cogs 466. [NOIP2009] 细胞分裂
466. [NOIP2009] 细胞分裂 ★★ 输入文件:cell.in 输出文件:cell.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] Hanks ...
- JDK+JDBC+MySQL实例及注意事项
by qx.zhong Hangzhou 29 Jun 2014 开发环境 OS: Win8.1 x64 JDK: 1.8 SE DB: MySQL 5.5 Lib: mysql-connec ...
- Android TextView 横向滚动(跑马灯效果)
Android TextView 中当文字比較多时希望它横向滚动显示,以下是一种亲測可行的方法. 效果图: 1.自己定义TextView,重写isFocused()方法返回true,让自己定义Text ...