IOS中block和代理
从ios4开始引入block,就是代码块,结构类c语言
基本结构 返回值 (^block名称)(参数):int(^BlockName)(int):返回值为int型,参数是一个int值的叫BlockName的block
我们使用一个block时:
// 代码例子
int (^BlockExample)(int); BlockExample = ^(int n){return n*;}; int result = BlockExample();
个人使用场景:
一:动画
我第一次接触到block是动画块,之前写UIView动画块的时候都是begin和end之间写需要处理的动画效果,结束要得在delegate中实现,而且一个页面上所有的动画结束回调都在一个方法中区分,确实有点蛋疼
之后出现block方式简介明了很多:
[UIView animateWithDuration: delay: options:UIViewAnimationOptionBeginFromCurrentState animations:^{
//做动画的内容
} completion:^(BOOL finished) {
//动画完成后的回调
}];
二:数据请求回调
先前请求回调都会在代理方法中完成,现在直接在发起请求方法中加一个complete block
//数据请求代码块
[self postRequest:request getReustl:^{
//get result
}];
三:枚举回调
之前我们会用for循环去访问array中每个元素,现在我们会用到block:
//array enum的例子
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
//处理array中每个元素
}];
四:多线程gcd
后面在多线程中接触到block:比较直观
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ), ^{
//需要在多线程进行的操作
dispatch_async(dispatch_get_main_queue(), ^{
//主线程操作
});
});
*在block中修改变量
我们没法去修改一个变量的值除非在这个变量前面加上__block
错误的做法
int i = ;
[self excuteBlock:^{ i = ; }]; 正确的做法:
__block int i = ;
[self excuteBlock:^{ i = ; }];
*我们有时候会遇到block会retain住整个页面,使其返回的时候无法调用dealloc,从而没法释放内存
所以我们在block内都会用弱引用retain cycle的问题
比如:
typeof(self) __weak weakSelf = self;
[self excuteTask:task success:^(id responseModel) {
//handle success
weakSelf.bottomView.isLike = YES;
[weakSelf doSomeThing];
} failure:^(NSError *error) {
//handle failure
}];
*什么时候用代理,什么时候用block
公共接口,方法较多也选择用delegate进行解耦
iOS有很多例子比如最常用tableViewDelegate,textViewDelegate
异步和简单的回调用block更好
iOS有很多例子比如常用的网络库AFNetwork,ASIHTTP库,UIAlertView类。
IOS中block和代理的更多相关文章
- iOS中block的用法 以及和函数用法的区别
ios中block的用法和函数的用法大致相同 但是block的用法的灵活性更高: 不带参数的block: void ^(MyBlock)() = ^{}; 调用的时候 MyBlock(); 带参数的 ...
- iOS 中Block以及Blocks的使用,闭包方法调用
OC: -(void)dataWithUrl:(NSString*)string AndId:(NSInteger)id returnName:(void(^)(NSString*name))back ...
- iOS中block类型大全
iOS中block类型大全 typedef的block 作为属性的block 作为变量的block 作为方法变量入参的block 作为方法参数的block 无名block 内联函数的block 递归调 ...
- iOS中Block介绍(一)基础
ios开发block的使用指南,以及深入理解block的内存管理,也适用于osx开发.讨论范围:block的使用,内存管理,内部实现.不包含的内容:gc arc下的block内存,block在c++中 ...
- iOS中Block介绍 基础
ios开发block的使用指南,以及深入理解block的内存管理,也适用于osx开发.讨论范围:block的使用,内存管理,内部实现.不包含的内容:gc arc下的block内存,block在c++中 ...
- iOS中Block的用法,举例,解析与底层原理(这可能是最详细的Block解析)
1. 前言 Block:带有自动变量(局部变量)的匿名函数.它是C语言的扩充功能.之所以是拓展,是因为C语言不允许存在这样匿名函数. 1.1 匿名函数 匿名函数是指不带函数名称函数.C语言中,函数是怎 ...
- iOS之 block,代替代理作为回调函数
最近在弄一个视频会议的项目,但今天要说的跟视频基本没关系,我们来说一下在一个view中创建一个button,在controller中加载这个view 当button被点击后将时间响应传递给contro ...
- iOS中Block使用探索
Block介绍 Block在ios 4.0之后加入,并大量使用在新的ios api中.block是一个匿名的代码块,可以传递给其他对象的参数,并得到返回值.从本质上讲,block同其他普通的变量类似, ...
- iOS 中block中使用了外部变量的分析
例子1: ; void (^blk)(void) = ^(){ printf("in block %d[%p]\n", val, &val); //in block 10[ ...
随机推荐
- Hadoop_常用存储与压缩格式
HDFS文件格式 file_format: TEXTFILE 默认格式 RCFILE hive 0.6.0 和以后的版本 ORC hive 0.11.0 和以后的版本 PARQUET hive 0.1 ...
- JSP实现在项目在网页上查询
<table> <caption>user</caption> <tr> <td>编号</td> <td>姓名< ...
- eayui datagrid 分页 排序 详解
最近因为经常使用easyui 在做表格时难免后出现排序 及分页的问题,但是 在官网中没有 相关的介绍及例子,所以经过多方面的查找后,终于完成了分页 和排序的功能 首先 页面datagrid 要排序的必 ...
- Unity - 接入Android SDK
在网络上,关于Unity与Android如何进行交互,雨松MOMO大神已经有两篇文章简单介绍了如何操作(1)Unity3D研究院之打开Activity与调用JAVA代码传递参数(2)Unity3D研究 ...
- 关于shiro
1.1 简介 Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可能没有Spring Securi ...
- C#_基础:委托速讲
1定义:委托=函数指针 C# public delegate void Test(string str); 等价C++ public void (*Test)(string str): 委托赋值(初始 ...
- 测试MailUtils,作用是发邮件
package cn.itcast.test; import java.io.IOException; import javax.mail.MessagingException; import jav ...
- PCA与LDA的区别与联系
由于涉及内容较多,这里转载别人的博客: http://blog.csdn.net/sunmenggmail/article/details/8071502 其实主要在于:PCA与LDA的变换矩阵不同, ...
- ASP.NET Aries 开源开发框架:开发指南(一)
前言: 上周开源了Aries开发框架后,好多朋友都Download了源码,在运行过程里,有一些共性的问题会问到. 所以本篇打算写一下简单的开发指南,照顾一下不是太看的懂源码的同学,同时也会讲解一下框架 ...
- 辛巴学院-Unity-剑英陪你零基础学c#系列(三)计算与类型
辛巴学院:正大光明的不务正业. 中秋节快乐,每逢佳节倍思亲,尤其是那素未谋面的老婆,对吧,屌丝们. 今天我们来探索一下C#里面奇怪的计算,奇怪的类型. 奇怪的计算 当我刚刚接触计算机编程的时候,一 ...