从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和代理的更多相关文章

  1. iOS中block的用法 以及和函数用法的区别

    ios中block的用法和函数的用法大致相同 但是block的用法的灵活性更高: 不带参数的block: void ^(MyBlock)() = ^{}; 调用的时候  MyBlock(); 带参数的 ...

  2. iOS 中Block以及Blocks的使用,闭包方法调用

    OC: -(void)dataWithUrl:(NSString*)string AndId:(NSInteger)id returnName:(void(^)(NSString*name))back ...

  3. iOS中block类型大全

    iOS中block类型大全 typedef的block 作为属性的block 作为变量的block 作为方法变量入参的block 作为方法参数的block 无名block 内联函数的block 递归调 ...

  4. iOS中Block介绍(一)基础

    ios开发block的使用指南,以及深入理解block的内存管理,也适用于osx开发.讨论范围:block的使用,内存管理,内部实现.不包含的内容:gc arc下的block内存,block在c++中 ...

  5. iOS中Block介绍 基础

    ios开发block的使用指南,以及深入理解block的内存管理,也适用于osx开发.讨论范围:block的使用,内存管理,内部实现.不包含的内容:gc arc下的block内存,block在c++中 ...

  6. iOS中Block的用法,举例,解析与底层原理(这可能是最详细的Block解析)

    1. 前言 Block:带有自动变量(局部变量)的匿名函数.它是C语言的扩充功能.之所以是拓展,是因为C语言不允许存在这样匿名函数. 1.1 匿名函数 匿名函数是指不带函数名称函数.C语言中,函数是怎 ...

  7. iOS之 block,代替代理作为回调函数

    最近在弄一个视频会议的项目,但今天要说的跟视频基本没关系,我们来说一下在一个view中创建一个button,在controller中加载这个view 当button被点击后将时间响应传递给contro ...

  8. iOS中Block使用探索

    Block介绍 Block在ios 4.0之后加入,并大量使用在新的ios api中.block是一个匿名的代码块,可以传递给其他对象的参数,并得到返回值.从本质上讲,block同其他普通的变量类似, ...

  9. iOS 中block中使用了外部变量的分析

    例子1: ; void (^blk)(void) = ^(){ printf("in block %d[%p]\n", val, &val); //in block 10[ ...

随机推荐

  1. 模拟--poj1835宇航员的故事

    这道题委实无语了,刚开始以为是很一般的方位模拟题,懒得看样例直接写的代码,然后敲了好几个switch结果样例居然没出来.. 仔细分析了样例之后才发现原来随着宇航员方位的改变他的左手方向以及头顶方向是跟 ...

  2. JSONP跨域处理实例

    <!DOCTYPE> <html> <head> <meta http-equiv="Content-Type" content=&quo ...

  3. myeclipse导入项目出现jquery错误(有红叉)

    今天导入了一个项目,但是进去之后jquery出现了红叉,如图(事实上在我没调好之前两个jquery文件都有叉号) 怎么调呢?右键jquery文件,选择MyEclipse->Exclude Fro ...

  4. Permission denied user=hadoop access=WRITE inode=root rootsupergroup rwxr

    有段时间没有写了,反正我写的都是跟流水账一样.不为别人看,当然,其中也记录了很多我踩过的坑,可能也能给别人提个醒.最重要的是:这是我学习的记忆 上面的错误是由于我将reducer的输出目录设置在hdf ...

  5. svn相关知识点

    1.查找linux操作系统:uname -a 2.svn 安装:yum install -y subversion 3.svn操作命令 a.将文件checkout到本地目录: svn co svn:/ ...

  6. Excel导入导出组件的设计

    前言: 距离一篇文章,又八九个月过去了,随着在园子露脸的次数越来越少,正如我们淡忘上一波大神那样,我们也正下一波所淡忘. 这八九个月,前前后,游走在十来个项目上,忙,却找不到成就感. 人过30后,也是 ...

  7. ENode框架Conference案例分析系列之 - 架构设计

    Conference架构概述 先贴一下Conference案例的在线地址,UI因为完全拿了微软的实现,所以都是英文的,以后我有空再改为中文的. Conference后台会议管理:http://www. ...

  8. Unity3D游戏开发初探—3.初步了解U3D物理引擎

    一.什么是物理引擎? 四个世纪前,物理学家牛顿发现了万有引力,并延伸出三大牛顿定理,为之后的物理学界的发展奠定了强大的理论基础.牛顿有句话是这么说的:“如果说我看得比较远的话,那是因为我站在巨人的肩膀 ...

  9. Repository 仓储,你的归宿究竟在哪?(二)-这样的应用层代码,你能接受吗?

    写在前面 关于"Repository 仓储,你的归宿究竟在哪?"这个系列,本来是想写个上下篇,但是现在觉得,很有多东西需要明确,我也不知道接下来会写多少篇,所以上一篇的标题就改成了 ...

  10. [nRF51822] 9、基础实验代码解析大全 · 实验12 - ADC

    一.本实验ADC 配置 分辨率:10 位. 输入通道:5,即使用输入通道AIN5 检测电位器的电压. ADC 基准电压:1.2V. 二.NRF51822 ADC 管脚分布 NRF51822 的ADC ...