iOS高级编程之Blocks的应用场景
来源:互联网 发布:淘宝运营指数指是什么 编辑:程序博客网 时间:2024/06/10 12:27
Block描述
Block是iOS 4.0之后引入的程式语法,可以当作一个匿名函数来使用。
申明一个block函数
int(^testBlock)(int a,int b);
返回值类型 (^block名字)(传入参数)
在使用block时几个重要点:
1. block函数外的对象,在block语句块内只有可读访问权限。
2. 对外部对象进行__block申明解决了问题1.
3. 各类型的变数和block之间的互动:
GCD
GCD主要使用block来代替委托模式,使程序变得简洁,同时运行效率也得到提高.
static int clickNum = 0; self.Mylabel = [[UILabel alloc]init]; while (clickNum <20) { dispatch_async(dispatch_get_main_queue(), ^{ self.Mylabel.text = [NSString stringWithFormat:@"%d",clickNum++];//UI的绘制必须在主线程中 }); [NSThread sleepForTimeInterval:1]; }
循环引用
在消息通知 block 中引用到了 self,在这里 self 对象被 block retain,而 _observer 又 retain 该 block的一份拷贝,通知中心又持有 _observer。因此只要 _observer 对象还没有被解除注册,block 就会一直被通知中心持有,从而 self 就不会被释放,其 dealloc 就不会被调用。而我们却又期望在 dealloc 中通过 removeObserver 来解除注册以消除通知中心对 _observer/block 的 retain。
同时,_observer 是在 self 所在类中定义赋值,因此是被 self retain 的,这样就形成了循环引用
__weak KSViewController * wself = self; _observer = [[NSNotificationCenter defaultCenter] addObserverForName:@"TestNotificationKey" object:nil queue:nil usingBlock:^(NSNotification *n) { KSViewController * sself = wself; if (sself) { NSLog(@"%@", sself); } else { NSLog(@" dealloc before we could run this code."); } }];
可以用 weak–strong dance 技术来解决:
首先,在 block 之前定义对 self 的一个弱引用 wself,因为是弱引用,所以当 self 被释放时 wself 会变为 nil;然后在 block 中引用该弱应用,考虑到多线程情况,通过使用强引用 sself 来引用该弱引用,这时如果 self 不为 nil 就会 retain self,以防止在后面的使用过程中 self 被释放;然后在之后的 block 块中使用该强引用 sself,注意在使用前要对 sself 进行了 nil 检测,因为多线程环境下在用弱引用 wself 对强引用 sself 赋值时,弱引用 wself 可能已经为 nil 了。
通过这种手法,block 就不会持有 self 的引用,从而打破了循环引用。
Block内存管理
在 ARC 下,对 block 变量进行 copy 始终是安全的,无论它是在栈上,还是全局数据段,还是已经拷贝到堆上。对栈上的 block 进行 copy 是将它拷贝到堆上;对全局数据段中的 block 进行 copy 不会有任何作用;对堆上的 block 进行 copy 只是增加它的引用记数。
- iOS高级编程之Blocks的应用场景
- iOS高级编程之KVO、KVC的理解与使用场景
- 《Objective-C 高级编程》读书笔记之 Blocks
- iOS高级编程之多线程的使用场景深入探索
- Blocks的编程应用笔记
- iOS高级编程之多媒体的应用
- ios数据库应用高级编程
- iOS网络高级编程:iPhone和iPad的企业应用开发之错误处理
- Ember的一些高级应用场景解决方案
- 【IOS学习】之八、Blocks的实现
- iOS之blocks操作
- 嵌入式linux网络编程之connect()函数的高级应用
- 嵌入式linux网络编程之connect()函数的高级应用
- 嵌入式linux网络编程之connect()函数的高级应用
- 嵌入式linux网络编程之connect()函数的高级应用
- iOS高级编程之网络交互的探索
- iOS Blocks 编程(一)
- iOS Blocks 编程(二)
- ICA(独立成分分析)在信号盲源分离中的应用
- javascript正则表达式进行验证
- iOS-OC-WKWebView UIScrollView 全屏截图,网页全屏截图
- js判断手机网站,手机浏览器检测,并跳转到手机网站代码
- Intel汇编程序设计-高级过程(上)
- iOS高级编程之Blocks的应用场景
- 通过构造方法或者工厂方法创建实例的区别
- apache ab压力测试工具的参数详解
- Linux学习之内建命令和外部命令详解
- 机器学习相关领域
- 用数据库实现通讯录(删除和搜索联系人)
- keyshot实时3D渲染软件(32位) 最新破解版下载
- 图像中直线的检测——Hough变换原理
- mongdb学习