谁有唐巧 ios进阶 pdf的《iOS开发进阶》的PDF版?

《iOS 开发进阶》.唐巧.随书示例程序 - 下载频道
- CSDN.NET
&&&&《iOS 开发进阶》.唐巧.随书示例程序
《iOS 开发进阶》.唐巧.随书示例程序
《iOS 开发进阶》.唐巧.随书示例程序,
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
您可能还需要
移动开发下载排行iOS开发进阶-唐巧 著-计算机与互联网-文轩网
定  价 : ¥65.00
文 轩 价 : ¥53.30 (8.2折)
配 送 至 : 中国四川省成都市
中国 四川省 成都市 请选择
作  者 :
所属分类 :
促销活动 : 阅读陪你放暑价.全场单笔满528减100,满99减10,畅销书低至5折!(电子书、百货除外)
购买数量 :
件 此商品已售出0本
服  务 : 由"文轩网"直接销售和发货,并提供售后服务 |||
购买最佳搭配 定 价:¥65.00 文轩价:¥53.30
¥53.30 (8.2折)
作 者: 著 出版社: 出版时间: 开 本:16开 页 数:244 印刷时间: 字 数:328.00千字 装 帧:平装 语  种:中文 版 次:1 印 次:3 I S B N:3
重磅推荐 文艺小说 少儿童书 经管励志 居家生活 科技考试
¥31.50¥42.00
¥100.70¥138.00
¥34.80¥59.00
¥31.00¥45.00
¥45.60¥68.00
¥29.90¥49.80
¥21.10¥39.80
¥314.40¥398.00
¥24.10¥49.80
¥19.80¥36.00
¥24.80¥36.00
¥206.60¥295.20
¥29.50¥39.80
¥28.70¥39.80
¥23.40¥36.00
¥28.90¥39.00
¥24.20¥35.00
¥70.30¥99.00
¥16.30¥25.00
¥24.20¥35.00
¥20.60¥29.80
¥18.80¥25.00
¥30.00¥39.50
¥24.50¥35.00
¥88.00¥176.00
¥123.80¥238.00
¥30.80¥39.00
¥46.80¥72.00
¥14.80¥20.90
¥27.00¥36.00
¥14.30¥22.00
¥13.80¥20.90
¥7.40¥10.00
¥13.50¥18.00
¥19.00¥25.00
¥63.80¥91.20
¥45.20¥58.00
¥37.70¥49.00
¥34.60¥48.00
¥38.20¥49.00
¥29.10¥39.80
¥53.80¥69.00
¥24.00¥34.80
¥85.00¥100.00
¥25.90¥39.80
¥29.60¥39.00
¥31.40¥39.80
¥29.00¥42.00
¥62.70¥99.60
¥26.50¥36.80
¥18.80¥28.00
¥18.80¥28.00
¥29.80¥39.80
¥32.40¥49.80
¥28.70¥39.90
¥29.20¥39.00
¥27.70¥36.00
¥29.80¥39.80
¥70.60¥98.00
¥22.80¥35.00
¥46.00¥59.00
¥131.00¥168.00
¥84.90¥114.80
¥35.00¥46.00
¥27.10¥39.80
¥252.00¥300.00
¥263.20¥283.00
¥227.00¥246.00
¥228.00¥247.00
¥225.20¥244.00
¥230.80¥250.00
¥338.70¥385.00
《iOS开发进阶》分工具、实践、理论三大部分。第一部分介绍iOS开发的常用工具,第二部分介绍iOS开发中的一些常见的实践经验,第三部分介绍iOS开发中涉及的原理。如果把成为iOS开发高手的过程比作武侠小说中的修炼过程的话,工具、实践和理论的学习就分别对应兵器、招式和内功的修炼。《iOS开发进阶》希望通过这三方面的综合讲解,全面提高开发者的技能水平。
隐藏全部&&唐巧,Blogger、InfoQ编辑,资深iOS开发者。曾在网易参与过网易邮箱、网易微博、有道云笔记的开发。目前正参与互联网教育公司猿题库的创业,负责猿题库和小猿搜题的iOS版本开发。
隐藏全部&&推荐序第1章引言11.1我为什么要写本书11.1.1我的构思11.1.2内容导读11.1.3目标读者21.1.4随书示例代码和勘误21.1.5致谢21.2如何提高iOS开发技能31.2.1阅读博客31.2.2读书31.2.3看WWDC视频41.2.4看苹果的官方文档41.2.5看开源项目的代码41.2.6多写代码,多思考41.2.7多和同行交流51.2.8分享5I第一部分:iOS开发工具第2章使用CocoaPods做依赖管理92.1CocoaPods简介92.2CocoaPods的安装和使用102.2.1CocoaPods的安装102.2.2使用CocoaPods的镜像索引102.2.3使用CocoaPods112.2.4查找第三方库112.3注意事项122.3.1关于.gitignore122.3.2为自己的项目创建podspec文件122.3.3使用私有的pods122.3.4不更新podspec122.3.5生成第三方库的帮助文档132.3.6原理13第3章网络封包分析工具Charles153.1Charles简介153.2Charles的安装和使用163.2.1安装Charles163.2.2安装SSL证书163.2.3将Charles设置成系统代理173.2.4Charles主界面介绍183.2.5过滤网络请求183.3使用Charles协助iOS开发193.3.1截取iPhone上的网络封包193.3.2模拟慢速网络213.4高级功能223.4.1截取SSL信息223.4.2修改网络请求内容233.4.3修改服务器返回内容253.5Map功能253.6Rewrite功能273.7Breakpoints功能293.8总结303.9参考链接30第4章界面调试工具Reveal314.1Reveal简介314.2Reveal的使用324.2.1用Reveal连接模拟器调试324.2.2用Reveal连接真机调试344.2.3用Reveal调试其他应用界面344.2.4总结354.2.5参考资料36第5章移动统计工具Flurry375.1Flurry简介375.2Flurry的基本使用385.2.1注册和下载对应SDK385.2.2集成SDK405.2.3自定义统计项425.2.4查看统计结果435.2.5统计Crashlog445.3对比和总结455.3.1和其他统计分析平台的对比455.3.2总结45第6章崩溃日志记录工具Crashlytics476.1Crashlytics简介476.2Crashlytics的使用496.3实现原理和使用体会52第7章AppStore统计工具AppAnnie557.1AppAnnie简介557.2AppAnnie的使用567.3AppAnnie账号的注册及配置597.4和其他工具的对比607.4.1官方的命令行工具607.4.2其他类似服务617.4.3功能对比61第8章Xcode插件638.1Xcode插件管理工具Alcatraz638.1.1简介638.1.2安装和删除648.1.3使用648.1.4插件路径668.2关于Xcode的插件机制668.3常用Xcode插件668.3.1KSImageNamed668.3.2XVim678.3.3FuzzyAutocompletePlugin678.3.4XToDo678.3.5BBUDebuggerTuckAway688.3.6SCXcodeSwitchExpander688.3.7deriveddata—exterminator688.3.8VVDocumenter698.3.9ClangFormat698.3.10ColorSense698.3.11XcodeBoost70第9章其他工具介绍719.1取色工具:数码测色计(DigitalColorMeter)719.1.1前言719.1.2使用介绍719.1.3其他类似工具:xScope729.2其他图形工具739.2.1ImageOptim739.2.2马克鳗749.2.3Dash749.2.4蒲公英759.3命令行工具759.3.1nomad759.3.2xctool769.3.3appledoc76第二部分:iOS开发实践第10章理解内存管理8110.1引用计数8110.1.1什么是引用计数,原理是什么8110.1.2我们为什么需要引用计数8310.1.3不要向已经释放的对象发送消息8510.1.4循环引用(referencecycles)问题8510.1.5使用Xcode检测循环引用8810.2使用ARC9010.2.1AutomaticReferenceCount9010.2.2CoreFoundation对象的内存管理92第11章掌握GCD9511.1GCD简介9511.2使用GCD9711.2.1block的定义9711.2.2系统提供的dispatch方法9811.2.3修改block之外的变量9911.2.4后台运行9911.2.5总结100第12章使用UIWindow10112.1UIWindow简介10112.2为UIWindow增加UIView10212.3系统对UIWindow的使用10212.3.1WindowLevel10412.3.2手工创建UIWindow10512.3.3不要滥用UIWindow10812.3.4参考资料109第13章动态下载系统提供的多种中文字体11113.1功能简介11113.1.1前言11113.1.2功能介绍11213.1.3字体列表11213.2使用教程11313.2.1相关API介绍11313.2.2总结115第14章使用应用内支付11714.1后台设置11714.2iOS端开发11914.3服务端开发12114.4注意事项122第15章基于UIWebView的混合编程12315.1混合编程简介12315.2使用模板引擎渲染HTML界面12415.3Objective—C语言和JavaScript语言相互调用12615.4如何传递参数12915.5同步和异步12915.6注意事项13015.6.1线程阻塞问题13015.6.2主线程的问题13015.6.3键盘控制13015.6.4CommonJS规范13015.7使用Safari进行调试131第16章安全性问题13516.1前言13516.2网络安全13516.2.1安全地传输用户密码13516.2.2防止通讯协议被轻易破解13716.2.3验证应用内支付的凭证13816.3本地文件和数据安全13816.3.1程序文件的安全13816.3.2本地数据安全14016.4源代码安全14016.5总结142第17章基于CoreText的排版引擎14317.1CoreText简介14317.2基于CoreText的基础排版引擎145第18章实战技巧18118.1AppStore与审核18118.1.1撤销正在审核的应用18118.1.2申请加急审核18118.1.3应用在市场的名字18218.1.4测试设备数的限制18218.1.5如何将应用下架18318.1.6如何举报别的应用侵权18318.1.7iTunesConnect后台操作出错18418.1.8MetadataReject18418.2开发技巧18418.2.1UILabel内容模糊18418.2.2收起键盘18418.2.3NSJSONSerialization比NSKeyedArchiver更好18518.2.4设置应用内的系统控件语言18518.2.5为什么viewDidUnload被废弃18818.2.6多人协作慎用Storyboard18918.2.7避免滥用block19018.2.8合并工程文件的冲突19218.2.9忽略编译警告19318.3Xcode使用技巧19318.3.1Xcode快捷键19318.3.2查找技巧19518.3.3JavaScript文件设置调整19518.3.4清除DerivedData19618.3.5target信息异常19718.3.6下载Xcode19718.4调试技巧19718.4.1模拟器快捷键19718.4.2覆盖安装注意事项19718.4.3给模拟器相册增加图片19818.4.4获得模拟器中的程序数据19818.4.5安装旧版本的模拟器19918.4.6模拟慢速网络19918.4.7异常断点与符号断点19918.5ipa文件格式19918.5.1查看ipa的内容19918.5.2查看ipa中的图片20018.6为工程增加DailyBuild20118.6.1前言20118.6.2步骤20118.6.3遇到的问题20618.6.4总结20618.7使用脚本提高开发效率20618.7.1删除未使用的图片资源20618.7.2用脚本自动生成小尺寸的图片20718.7.3检查图片20818.8管理代码片段20918.8.1代码片段介绍20918.8.2定义自己的代码片段21018.8.3使用Git管理代码片段21118.8.4其他代码片段管理工具211第三部分:iOS开发底层原理第19章Objective—C对象模型21519.1简介21519.2isa指针21519.3类的成员变量21719.4对象模型的应用22019.4.1动态创建对象22019.4.2系统相关API及应用22219.4.3参考文献226第20章TaggedPointer对象22720.1原有系统的问题22720.2TaggedPointer介绍22820.2.1TaggedPointer22820.2.2特点23020.3注意事项和实现细节23120.3.1isa指针23120.3.264位下的isa指针优化23120.3.3isa的bit位含义23220.3.4总结23320.3.5参考文献233第21章block对象模型23521.1block的内部数据结构定义23521.2用clang分析block实现23721.2.1NSConcreteMallocBlock类型的block的实现24221.2.2变量的复制24321.3注意事项24321.3.1避免循环引用24321.3.2ARC对block类型的影响24421.3.3参考文献
隐藏全部&&&&&&前言&&&&人生如长跑,成长如进阶&&&&曾经有很多次想提笔写一本纯粹的技术图书,有几次甚至已经把目录做完了,但是看到“层峦叠嶂”的目录结构,我总是心生恐惧。一想到要耗费一年多的业余时间去写那些枯燥无味的技术文字,并逐一核对各种技术细节,我仿佛置身幽暗的森林而无法自拔。计划还未开始,就已经结束了。&&&&总有人会去做这些费时费力并能够惠及大众的事情,他们像一个个沉默的跑者,在奔跑的同时,不停地标出路线,记录经验,传播技巧,并吸引更多的人加入跑步的队伍一起成长。&&&&唐巧就是其中之一。&&&&我很早就认识了唐巧,那时他还是一个初入江湖的“小球”,高高瘦瘦,正在网易有道做云笔记的开发。短短几年之内,唐巧获得了飞速的成长,他不仅是一个优秀的iOS&开发者,而且成为iOS&领域的布道者。他从2011&年开始构建独立博客“唐巧的技术博客”,撰写了大量的iOS&开发相关的文章,成为知名iOS&博主。2012&年唐巧离开网易有道,加入猿题库,成为一个创业者。期间他组建了由iOS&开发领域顶尖开发者构成的“真?iOS&开发”QQ&群,大家一边在群里讨论技术问题,一边通过各自的博客把成果分享出去。我有幸参与其中,可以说,这是iOS&领域最专业的技术群体之一。2013&年春节,唐巧开通了微信公众平台“iOS&开发”(iOSDevTips),开始基于微信公众号传播自己的开发理念和相关技术,迄今为止已经积累了一万多名专业订阅者。&&&&在承担日常研发任务的同时,还能做这么多的技术写作和内容分享,他让我这个老程序员亦十分佩服。&&&&2013&年的一天,我在一次技术会议上碰到了唐巧,谈起了技术写作的事情。现在国内iOS&开发领域的技术图书良莠不齐,很多是“编著”,摘抄或翻译自官方文档,而且大家很喜欢去写入门类的图书,从编程语言、MVC、协议、策略到Xcode&的使用,到第一个App&项目的构建,等等,高级一点的进阶内容就少有涉及,很多iOS&开发者让我推荐一本面向中高级开发者的中文书时,我总是遍寻不着。那时候我正准备出版自己的《MacTalk?人生元编程》,于是也希望唐巧写一本iOS&进阶方面的书。我对唐巧说,你的博客上已经产出了那么多高质量的iOS&开发进阶内容,为什么不再增加一些内容,集结成册梳理成书呢?他若有所思地回答,我正准备这么干!&&&&经年以后,唐巧再也没和我提起这件事,我也在忙忙碌碌中把他的书忘得一干二净。上周突然收到唐巧的一份书稿,打开一看,《iOS&开发进阶》静静地躺在邮箱里,已然成书。唐巧用了一年的时间,在博客文章的基础上进行完善、修改、增补,用清晰的“丝线”把散落各处的“珍珠”串起,形成脉络完整的知识体系,然后又新增了超过成书一半的内容,最终完成了这本关于iOS&开发的进阶图书。&&&&书中从iOS&开发实战最常用的工具讲起,一直写到底层开发原理。内容分成三块:工具、实践和原理,每个章节都独立成文,读者可以从头细细品读,也可以随时翻阅其中一节,利用碎片时间阅读学习。就我个人而言,非常喜欢实践和原理两个部分,比如处理多核编程的GCD&技术、应用程序安全技术、CoreText&的排版引擎、Objective-C&对象模型、block&对象模型等,这些内容要么能帮助我解决实际问题,要么能够答疑解惑,深入细节。作为一个仍然在一线开发的技术作者,唐巧采用了图文并茂的方式去阐述问题,每个技术专题都配备了恰当的代码,力求将复杂的技术以最为简洁的方式呈现出来,让读者一目了然,读来深入浅出,并不枯燥。&&&&写书永远有遗憾。由于出版时间的要求,这本书的原理部分略显单薄,另外,全书并未涉及苹果的最新语言Swift&相关的内容,相关的代码示例都是基于Objective-C&的。希望唐巧的下一本书能够涉及更多这部分内容,这也是我的一个心愿。&&&&在这样一个原创匮乏的年代,我能做到的就是向更多的人去推荐这样一本书。人生如长跑,成长如进阶,如果你是一个iOS&开发者,这本书一定不要错过!&&&&池建强&&&&《MacTalk·人生元编程》作者&&&&微信平台MacTalk&出品人&&&&2014&年,冬
隐藏全部&&
好评 中评 差评 天猫评论
猓子狸 普通会员
猓子狸 普通会员
文轩网作为纸质出版物网络销售平台,所售图书均为全新正版,请放心购买。
文轩网图书/音像单笔订单收5元运费(含内蒙古、青海、海南、新疆、西藏、宁夏,港澳台及海外地区除外)。
与文轩网合作的物流公司有:申通/圆通/CCES/港中能达/邮政经济快递/邮政平邮等。(发货系统自动匹配,暂时无法指定快递)
没有解决您的问题?
暂无提问,您可以咨询我们,我们会在一个工作日内响应~输入上方四位验证码
进入下载列表
暂时没有文件描述,如果您是文件上传者,请记得到“我的文件”添加文件描述信息噢。Objective-C对象模型及应用 - 唐巧的技术博客
记录下自己学习的点滴
Objective-C对象模型及应用
Oct 15th, 2013
原创文章,转载请注明出自。
本文主要介绍Objective-C对象模型的实现细节,以及Objective-C语言对象模型中对isa swizzling和method swizzling的支持。希望本文能加深你对Objective-C对象的理解。
Objective-C是一门面向对象的编程语言。每一个对象都是一个类的实例。在Objective-C语言的内部,每一个对象都有一个名为isa的指针,指向该对象的类。每一个类描述了一系列它的实例的特点,包括成员变量的列表,成员函数的列表等。每一个对象都可以接受消息,而对象能够接收的消息列表是保存在它所对应的类中。
在XCode中按Shift + Command + O, 然后输入NSObject.h和objc.h,可以打开NSObject的定义头文件,通过头文件我们可以看到,NSObject就是一个包含isa指针的结构体,如下图所示:
按照面向对象语言的设计原则,所有事物都应该是对象(严格来说Objective-C并没有完全做到这一点,因为它有象int, double这样的简单变量类型)。在Objective-C语言中,每一个类实际上也是一个对象。每一个类也有一个名为isa的指针。每一个类也可以接受消息,例如[NSObject alloc],就是向NSObject这个类发送名为alloc消息。
在XCode中按Shift + Command + O, 然后输入runtime.h,可以打开Class的定义头文件,通过头文件我们可以看到,Class也是一个包含isa指针的结构体,如下图所示。(图中除了isa外还有其它成员变量,但那是为了兼容非2.0版的Objective-C的遗留逻辑,大家可以忽略它。)
因为类也是一个对象,那它也必须是另一个类的实列,这个类就是元类(metaclass)。元类保存了类方法的列表。当一个类方法被调用时,元类会首先查找它本身是否有该类方法的实现,如果没有,则该元类会向它的父类查找该方法,直到一直找到继承链的头。
元类(metaclass)也是一个对象,那么元类的isa指针又指向哪里呢?为了设计上的完整,所有的元类的isa指针都会指向一个根元类(root metaclass)。根元类(root metaclass)本身的isa指针指向自己,这样就行成了一个闭环。上面提到,一个对象能够接收的消息列表是保存在它所对应的类中的。在实际编程中,我们几乎不会遇到向元类发消息的情况,那它的isa指针在实际上很少用到。不过这么设计保证了面向对象的干净,即所有事物都是对象,都有isa指针。
我们再来看看继承关系,由于类方法的定义是保存在元类(metaclass)中,而方法调用的规则是,如果该类没有一个方法的实现,则向它的父类继续查找。所以,为了保证父类的类方法可以在子类中可以被调用,所以子类的元类会继承父类的元类,换而言之,类对象和元类对象有着同样的继承关系。
我很想把关系说清楚一些,但是这块儿确实有点绕,下面这张图或许能够让大家对isa和继承的关系清楚一些(该图片来自)
该图中,最让人困惑的莫过于Root Class了。在实现中,Root Class是指NSObject,我们可以从图中看出:
NSObject类包括它的对象实例方法。
NSObject的元类包括它的类方法,例如alloc方法。
NSObject的元类继承自NSObject类。
一个NSObject的类中的方法同时也会被NSObject的子类在查找方法时找到。
类的成员变量
如果把类的实例看成一个C语言的结构体(struct),上面说的isa指针就是这个结构体的第一个成员变量,而类的其它成员变量依次排列在结构体中。排列顺序如下图所示(图片来自《iOS 6 Programming Pushing the Limits》):
为了验证该说法,我们在XCode中新建一个工程,在main.m中运行如下代码:
#import &UIKit/UIKit.h&
@interface Father : NSObject {
int _father;
@implementation Father
@interface Child : Father {
int _child;
@implementation Child
int main(int argc, char * argv[])
Child * child = [[Child alloc] init];
@autoreleasepool {
我们将断点下在 @autoreleasepool 处,然后在Console中输入p *child,则可以看到Xcode输出如下内容,这与我们上面的说法一致。
(lldb) p *child
(Child) $0 = {
(Father) Father = {
(NSObject) NSObject = {
(Class) isa = Child
(int) _father = 0
(int) _child = 0
可变与不可变
因为对象在内存中的排布可以看成一个结构体,该结构体的大小并不能动态变化。所以无法在运行时动态给对象增加成员变量。
相对的,对象的方法定义都保存在类的可变区域中。Objective-C 2.0并未在头文件中将实现暴露出来,但在Objective-C 1.0中,我们可以看到方法的定义列表是一个名为 methodLists的指针的指针(如下图所示)。通过修改该指针指向的指针的值,就可以实现动态地为某一个类增加成员方法。这也是Category实现的原理。同时也说明了为什么Category只可为对象增加成员方法,却不能增加成员变量。
需要特别说明一下,通过objc_setAssociatedObject 和 objc_getAssociatedObject方法可以变相地给对象增加成员变量,但由于实现机制不一样,所以并不是真正改变了对象的内存结构。
除了对象的方法可以动态修改,因为isa本身也只是一个指针,所以我们也可以在运行时动态地修改isa指针的值,达到替换对象整个行为的目的。不过该应用场景较少。
系统相关API及应用
isa swizzling的应用
系统提供的KVO的实现,就利用了动态地修改isa指针的值的技术。在中可以看到如下描述:
Key-Value Observing Implementation DetailsAutomatic key-value observing is implemented using a technique called isa-swizzling.The isa pointer, as the name suggests, points to the object’s class which maintains a dispatch table. This dispatch table essentially contains pointers to the methods the class implements, among other data.When an observer is registered for an attribute of an object the isa pointer of the observed object is modified, pointing to an intermediate class rather than at the true class. As a result the value of the isa pointer does not necessarily reflect the actual class of the instance.You should never rely on the isa pointer to determine class membership. Instead, you should use the class method to determine the class of an object instance.
类似的,使用isa swizzling的技术的还有系统提供的Key-Value Coding(KVC)。 (谢谢大家指出错误,KVC并没有使用到isa swizzling)
Method Swizzling API说明
Objective-C提供了以下API来动态替换类方法或实例方法的实现:
class_replaceMethod 替换类方法的定义
method_exchangeImplementations 交换2个方法的实现
method_setImplementation 设置1个方法的实现
这3个方法有一些细微的差别,给大家介绍如下:
class_replaceMethod在苹果的文档(如下图所示)中能看到,它有两种不同的行为。当类中没有想替换的原方法时,该方法会调用class_addMethod来为该类增加一个新方法,也因为如此,class_replaceMethod在调用时需要传入types参数,而method_exchangeImplementations和method_setImplementation却不需要。
method_exchangeImplementations 的内部实现相当于调用了2次method_setImplementation方法,从苹果的文档中能清晰地了解到(如下图所示)
从以上的区别我们可以总结出这3个API的使用场景:
class_replaceMethod, 当需要替换的方法可能有不存在的情况时,可以考虑使用该方法。
method_exchangeImplementations,当需要交换2个方法的实现时使用。
method_setImplementation 最简单的用法,当仅仅需要为一个方法设置其实现方式时使用。
以上3个方法的源码在,感兴趣的同学可以读一读。
我们在开发客户端的笔记功能时,需要使用系统的UIImagePickerController。但是,我们发现,在iOS6.0.2系统下,系统提供的UIImagePickerController在iPad横屏下有转屏的Bug,造成其方向错误。具体的Bug详情可以见。
为了修复该Bug,我们需要替换UIImagePickerController的如下2个方法
- (BOOL)shouldAutorotate;
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation;
我们先实现了一个名为ImagePickerReplaceMethodsHolder的类,用于定义替换后的方法和实现。如下所示:
// ImagePickerReplaceMethodsHolder.h
@interface ImagePickerReplaceMethodsHolder : NSObject
- (BOOL)shouldAutorotate;
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation;
// ImagePickerReplaceMethodsHolder.m
@implementation ImagePickerReplaceMethodsHolder
- (BOOL)shouldAutorotate {
return NO;
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return UIInterfaceOrientationPortrait;
然后,我们在调用处,判断当前的iOS版本,对于[iOS6.0, iOS6.1)之间的版本,我们将UIImagePickerController的有问题的方法替换。具体代码如下:
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)
([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v)
([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
[self hackForImagePicker];
+ (void)hackForImagePicker {
// fix bug of image picker under iOS 6.0
// /questions//crash-on-presenting-uiimagepickercontroller-under-ios-6-0
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@&6.0&)
&& SYSTEM_VERSION_LESS_THAN(@&6.1&)) {
Method oldMethod1 = class_getInstanceMethod([UIImagePickerController class], @selector(shouldAutorotate));
Method newMethod1 = class_getInstanceMethod([ImagePickerReplaceMethodsHolder class], @selector(shouldAutorotate));
method_setImplementation(oldMethod1, method_getImplementation(newMethod1));
Method oldMethod2 = class_getInstanceMethod([UIImagePickerController class], @selector(preferredInterfaceOrientationForPresentation));
Method newMethod2 = class_getInstanceMethod([ImagePickerReplaceMethodsHolder class], @selector(preferredInterfaceOrientationForPresentation));
method_setImplementation(oldMethod2, method_getImplementation(newMethod2));
通过如上代码,我们就针对iOS特定版本的有问题的系统库函数打了Patch,使问题得到解决。
开源界的使用
有少量不明真相的同学以为苹果在审核时会拒绝App使用以上API,这其实是对苹果的误解。使用如上API是安全的。另外,开源界也对以上方法都适当的使用。例如:
著名的网络库。AFNetworking网络库(v1.x版本)使用了class_replaceMethod方法(AFHTTPRequestOperation.m文件第105行)
。Nimbus是著名的工具类库,它在其core模块中提供了NIRuntimeClassModifications.h文件,用于提供上述API的封装。
国内的大众点评iOS客户端。该客户端使用了他们自己开发的基于Wax修改而来的,WaxPatch可以实现通过服务器更新来动态修改客户端的逻辑。而WaxPatch主要是修改了wax中的wax_instance.m文件,在其中加入了class_replaceMethod来替换原始实现,从而实现修改客户端的原有行为。
通过本文,我们了解到了Objective-C语言的对象模型,以及Objective-C语言对象模型中对isa swizzling和method swizzling的支持。本文也通过具体的实例代码和开源项目,让我们对该对象模型提供的动态性有了更加深刻的认识。
文章发表后,一些同行指出在ARM64的CPU下,isa的内部结构有变化。这点我是知道的,不过希望以后再撰文讨论。感兴趣的同学可以查看苹果今年WWDC2013的视频:《Session 404 Advanced in Objective-C》。
Posted by 唐巧
Oct 15th, 2013
原创文章,版权声明:自由转载-非商用-非衍生-保持署名 |
& 2015 - 唐巧 -
为本站提供存储空间

我要回帖

更多关于 ios开发进阶 电子版 的文章

 

随机推荐