对象之间通讯.pdfVIP

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
对象之间的通讯 对象间的通讯 对象之间需要通信,这也是所有软件的基础。再⾮凡的软件也需要通过对象通信来完 成复杂的⽬标。 章将深⼊讨论⼀些设计概念,以及如何依据这些概念来设计出良好 的架构。 Blocks Blocks 是 Objective-C 版 的 lambda 或者 closure (闭包)。 使⽤ block 定义异步接⼜: - (void)downloadObjectsAtPath:(NSString *)path completion:(void(^)(NSArra *objects, NSError * 当你定义⼀个类似上⾯的接⼜的时候,尽量使⽤⼀个单独的 block 作为接⼜的最后⼀ 个参数。把需要提供的数据和错误信息整合到⼀个单独 block 中,⽐分别提供成功和 失败的 block 要好。 以下是你应该这样做的原因: 通常这成功处理和失败处理会共享⼀些代码 (⽐如让⼀个进度条或者提⽰消 失); Apple 也是这样做的,与平台⼀致能够带来⼀些潜在的好处; block 通常会有多⾏代码,如果不是在最后⼀个参数的话会打破调⽤点; 使⽤多个 block 作为参数可能会让调⽤看起来显得很笨拙,并且增加了复杂 性。 看上⾯的⽅法,完成处理的 block 的参数很常见:第⼀个参数是调⽤者希望获取的数 据,第⼆个是错误相关的信息。这⾥需要遵循以下两点: 若 objects 不为 nil ,则 error 必须为 nil 若 objects 为 nil ,则 error 必须不为 nil 因为调⽤者更关⼼的是实际的数据,就像这样: - (void)downloadObjectsAtPath:(NSString *)path completion:(void(^)(NSArra *objects, NSError * if (objects) { // do something with the data } else { // some error occurred, error variable should not be nil } } 此外,Apple 提供的⼀些同步接⼜在成功状态下向 error 参数 (如果⾮ NULL) 写⼊了 垃圾值,所以检查 error 的值可能出现问题。 深⼊ Blocks ⼀些关键点: block 是在栈上创建的 block 可以复制到堆上 block 有⾃⼰的私有的栈变量 (以及指针)的常量复制 可变的栈上的变量和指针必须⽤ __block 关键字声明 如果 block 没有在其他地⽅被保持,那么它会随着栈⽣存并且当栈帧 (stack frame )返 回的时候消失。当在栈上的时候,⼀个 block 对访问的任何内容不会有影响。如果 block 需要在栈帧返回的时候存在,它们需要明确地被复制到堆上,这样,block 会像 其他 Cocoa 对象⼀样增加引⽤计数。当它们被复制的时候,它会带着它们的捕获作⽤ 域⼀起,retain 他们所有引⽤的对象。如果⼀个 block指向⼀个栈变量或者指针,那么 这个block初始化的时候它会有⼀份声明为 const 的副 ,所以对它们赋值是没⽤的。 当⼀个 block 被复制后,__block 声明的栈变量的引⽤被复制到了堆⾥,复制之后栈 上的以及产⽣的堆上的 block 都会引⽤这个堆上的变量。 ⽤ LL B 来展⽰ block 是这样⼦的: 最重要的事情是 __block 声明的变量和指针在 block ⾥⾯是作为显⽰操作真实值/对 象的结构来对待的。 block 在 Objective-C ⾥⾯被当作⼀等公民对待:他们有⼀个 isa 指针,⼀个类也是⽤ isa 指针来访问 Objective-C 运⾏时来访问⽅法和存储数据的。在⾮ ARC 环境肯定会 把它搞得很糟糕,并且悬挂指针会导致 Crash 。__block 仅仅对 block 内的变量起作 ⽤,它只是简单地告诉 block : 嗨,这个指针或者原始的类型依赖它们在的栈。请⽤⼀个栈上的新变量 来引⽤它。我是说,请对它进⾏双重解引⽤,不要 retain 它。 谢谢,哥 们。 如果

文档评论(0)

kehan123 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档