事实上,任何一个应用的开发都离不开多线程。而“块”block与GCD就是苹果OC语言中多线程的核心。
    
一.块的内部结构
     在oc中,块语法以闭包的形式存在,每一个Objective-C对象都占据着某个内存区域。块本身也是一个对象,在存放块的对象内存区域中,首个变量是指向Class的指针,该指针叫做isa。其余内存里含有块对象正常运转所需的各种信息。
    以下是块语法的内部结构变量。
    1.void*                                   isa(指向class的对象指针)
    2.int                                       flags
    3.int                                       reserved
    4.void(*)(void*,……)  invoke(函数指针)
    5.struct*                                 descriptor(结构体描述)
  
    根据上述块语法的内存结构可知,其中最重要的就是invoke变量,这是一个函数指针,指向的就是块的实现代码。
二.块在系统api回调中的应用
   在iOS的原生api中,有不少的地方都用到了块语法。其中最常见的主要是两个地方,一个就是数组和字典的块枚举,这种枚举方式是每一个NSArry和NSDictionary都自带的,其效率和便利性远远高于传统的for循环。

[self.p_tableArrenumerateObjectsUsingBlock:^(id obj,NSUInteger idx, BOOL *stop) {

<#code#>

}]

另一个常见的地方就是页面跳转present之后的完成回调,

[self presentViewController:<(UIViewController *)> animated:<(BOOL)> completion:<^(void)completion>]

三.块语法在UIAlertView中的集中代码

UIAlertView是一个弹窗控件,有一些按钮,最常见的就是确认和取消,UIAlertView有一个代理处理这些按钮,当用户点击后,该代理可以捕获按钮的下标,然后用户根据下标Index写一些逻辑代码。

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

快语法的第一个妙用就是可以直接在创建这个UIAlertView控件的时候就已经写好逻辑代码,完全不用写在以上回调中。

以下是具体实现。

第一步,申明一个全部的Block对象,根据UIAlertView的回调代理可知,该代理主要参数是一个NSInteger类型的参数,那么我们申明的Block对象可以根据代理的实际情况来创建。

@property(nonatomic,copy)void(^p_alertBlock)(NSInteger);

第二部,在创建这个UIAltView的地方实现这个全部的Block对象。

if(!self.p_alertBlock)

{

self.p_alertBlock = ^(NSInteger buttonIndex)

{

AccountViewController *acc = accc;

switch (buttonIndex) {

case 0:

break;

case 1:

if([acc.p_fmdbdeleteObjc:list])

{

[acc.p_tableArrremoveObjectAtIndex:acc.p_didSelect];

[acc.p_tablereloadData];

}

break;

}

};

}

UIAlertView *alt = [[UIAlertViewalloc] initWithTitle:NSLocalizedString(@"tip",nil)message:NSLocalizedString(@"sureDelet",nil) delegate:selfcancelButtonTitle:NSLocalizedString(@"cancel",nil) otherButtonTitles:NSLocalizedString(@"ok",nil),nil];

[altshow];

这是一个删除数据库操作的弹窗,当用户点击确认的时候删除数据库的对象,点击取消不做任何处理。
第三步,在UIAlertView的代理中运行快。

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

{

self.p_alertBlock(buttonIndex);

}

这个用法有一个好处就是可以在UIAlertView还未创建之前就已经确定了它按钮的处理,集中代码,看起来更加的方便和直观。

以上只是一个事例,在系统很多控件中都可以这样实现,诸如UIActionSheet等。

三.块语法替代Delegate

提起ios的消息通知,就少不了代理Delegate。代理尽管很方便,可是实现的过程比较繁琐。如果使用块语法的话,我们可以提前把回调函数的代码实现封装到Block中作为参数传递给数据层,这样子实际上在代理回调中

if(self.delegate && [self.delegaterespondsToSelector:@selector(setAddressSuccess:)])

{

[self.delegatesetAddressSuccess:self.accountList.remark];

}

这句话就被

Block(self.accountList.remark);所取代。

是不是更加的便捷了呢?关键是你根本就不用声明代理,实现,设置代理,维护协议等等复杂的过程。

代理还有一个限制就是必须要对象化,假如一个工具类是一个类的实例方法,你想在某些操作之后把数据回调给C层,这个时候代理就无法实行了,但是Block只不是是一个对象而已,就像NSString一样,可以帮助你实现。

以上只是块语法在系统控件API回调中的妙用和两个类之间代理的妙用,更多的功能还有待在实际开发中逐步挖掘发现。

仁者见仁,智者见智,块语法究竟强大到何种地步,等你用多了就知道了。

浅析ios开发中Block块语法的妙用相关推荐

  1. iOS开发中的Web应用概述

    为了更好的阅读体验,建议阅读原文 插播广告 -- 几十行代码完成资讯类App多种形式内容页 HybridPageKit :一个针对资讯类App高性能.易扩展.组件化的通用内容页实现框架. 想和我一起全 ...

  2. iOS 开发中的多线程

    线程.进程 什么是线程.进程   有的人说进程就像是人的脑袋,线程就是脑袋上的头发~~.其实这么比方不算错,但是更简单的来说,用迅雷下载文件,迅雷这个程序就是一个进程,下载的文件就是一个线程,同时下载 ...

  3. iOS开发UI篇—iOS开发中三种简单的动画设置

    [在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要"参与到"动画中 [UIView beginAnimations: ...

  4. iOS开发中多线程的那些事

    iOS开发深入之后还是要接触多线程和runloop的,写篇博客讲解.记录下iOS开发中的多线程技术. 线程.进程 什么是线程.进程   有的人说进程就像是人的脑袋,线程就是脑袋上的头发~~.其实这么比 ...

  5. iOS开发中各种关键字的区别

    1.一些概念 1.浅Copy:指针的复制,只是多了一个指向这块内存的指针,共用一块内存. 深Copy:内存的复制,两块内存是完全不同的, 也就是两个对象指针分别指向不同的内存,互不干涉. 2.atom ...

  6. ARC中block块作为属性的使用笔记

    ARC中block块作为属性的使用笔记 block较难理解,根据在内存中的分布情况就分为3种类型,根据使用的情形又分为很多很多种.虽然用起来容易,但使用不当会造成内存泄露,虽然都是这么说,但你真的研究 ...

  7. 浅谈iOS 开发中的界面通信

    在任何的软件开发中都离不开界面与界面之间的通信,界面通信的最直接的方法就是界面传值. 在开发过程中我们在页面传值时我们通常使用的方法有:属性传值法,block传值法,代理传值法,以及单例传值法,通知传 ...

  8. 在iOS开发中使用FMDB

    在iOS开发中使用FMDB 前言 SQLite (http://www.sqlite.org/docs.html) 是一个轻量级的关系数据库.iOS SDK 很早就支持了 SQLite,在使用时,只需 ...

  9. iOS开发中对NSArray或者NSMutableArray中的内容排序

    原文引用至               http://blog.unieagle.net/2012/05/10/ios开发中对nsarray或者nsmutablearray中的内容排序/ NSMuta ...

最新文章

  1. React学习笔记6:React Hooks API总结
  2. 解决SqlServer2008修改表后保存时出现“save changes is not permitted…”问题
  3. tomcat的安装和部署项目
  4. 他人评审18篇SCI文章的一点感受
  5. linux打开文件异常
  6. 有趣的圣诞节 库的打包
  7. MySQL5.7收集表统计信息时对该表上增删改查的影响
  8. CamOdoCal_2013-IROS_多个普通相机和里程计的内参和外参自动标定
  9. scala读取本地hdfs_scala读取hdfs数据库
  10. 药片计数器电路设计与实验
  11. python excel文件换题头
  12. 到底什么是5G LAN?
  13. 2020.10.08丨全长转录组之参考基因组比对
  14. 惠州市政企信息化(互联网)市场调研报告
  15. 多源异构作物组学数据融合方法研究——以高粱为例
  16. 安卓手机 忘记 锁屏密码
  17. 前端程序员Vue开发经验总结
  18. 计算机找不到指纹登陆,Win10电脑上登陆选项没有PIN码和指纹设置的解决教程
  19. Premiere Pro mac 22.6版本更新功能
  20. chromedriver中的浏览器选项

热门文章

  1. canal解析mysql日志异常_利用Canal解析mysql binlog日志
  2. 七十三、Python | Leetcode数字系列(上篇)
  3. 博士申请 | 宾州州立大学 (PSU) 招收机器学习/对抗学习方向全奖博士
  4. 通过互信息思想来缓解类别不平衡问题
  5. 近期有哪些值得读的推荐系统论文?来看看这份私人阅读清单
  6. ACL 2020 | 多跳问答的基于对齐的无监督迭代解释检索方法
  7. 漫画解读ERNIE:能和BERT一较高下的知识增强语义表示模型
  8. 2017年度最值得读的AI论文评选 | 大张旗鼓送福利
  9. Easy Multiplication 快速傅里叶变换
  10. hdu 1874 Dijkstra算法模板