- 1、本文档共13页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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 它。 谢谢,哥
们。
如果
您可能关注的文档
最近下载
- 北师大版数学六年级上册《2.2分数混合运算(二)》PPT课件.pptx VIP
- 车载DDM-MIMO雷达波形设计及抗干扰研究.pdf
- 2024年供电营业规则复习题库含答案解析.docx
- 医院用电分析报告.pptx VIP
- 2024年餐饮外卖小程序定制开发与推广合同协议书3篇.docx VIP
- 北京市2025年小升初分班测试数学试题(含解析).docx VIP
- 21CJ101-1 装配式电梯层门门套-高力装配式电梯层门防火门套.pdf VIP
- IATF16949--过程审核检查表-(含审核记录)-.doc VIP
- 译林版六年级上册英语Unit1_单元测试卷及答案.pdf VIP
- 餐饮小程序合同范本.docx VIP
文档评论(0)