深度解析iPhone Category用法

移动开发 iOS
本文介绍的是深度解析iPhone Category用法,假设你的库已经使用了Category,最后要使用放到真机上的时候发现,他Crash了。怎么办?先来看内容如何解决。

深度解析iPhone Category用法是本文要介绍的内容,在开发3.0的iPhone静态库的时候,遇到了一些问题。尽管我在应用程序链接的选项里头使用-ObjC的选项,我的程序在iPhone上运行时还是Crash了,而且经过定位之后发现,还是由库中的Category相关方法没有被链入导致的;而程序在模拟器上运行却是一点问题没有,Category的相关方法都能正确得到执行。

那么到底是什么原因导致在真机上应用程序没有将Category方法链入呢?答案还是在上次提到的这个苹果官方网页。该网页下方的IMPORTANT里头提到,在64位及iPhone OS系统里,由于编译器的Bug导致了-ObjC选项无法正常将静态库中的类的Category的方法载入!也就是说,

假设你的类叫MyClass,并且另外有个Category叫MyClass(Extent),那么如果你的应用程序链接你的库,使用MyClass(Extent)中的方法,程序将会Crash!要提的是,如果你的MyClass(Extent) 的实现是和MyClass的实现是在同一个实现体中,那么该Category的方法还是可以正常使用的,因为编译的时候会一起被载入。

那么,假设你的库已经使用了Category,最后要使用放到真机上的时候发现,他Crash了!那该怎么办呢?除了改代码,还是有一些补救方法的。

第一种,官方推荐的,但往往不是很好用的。使用-all_load选项,这会导致所有的类的方法都会被载入,不管“你的程序”有没有用到,所有的,包括系统的,方法会被载入。这个方法不仅会导致你的目标程序大小增大,而且往往容易引起一些冲突,而这些冲突往往你无法解决(常常出现在你链接的各种库中)。或者你可以使用-force_load,这个你可以指定要载入所有方法的库,这个算一个还不错的解决方法,但是仅在Xcode3.2之后才支持,如果你必须支持低版本的SDK的话,那么很悲剧,您这两种方法都不大适用!(悲剧如我,就是这种情况)

第二种,你使用的Category是你自己的类的Category,这是个常见的情况,自己的一个类比较大,分拆成多个文件时常用的手段。经过一段时间的思考,发现这种情况的解救方法还是比较容易的,虽然个人认为有点不优雅,但是可以很简单的解决掉。

你可以将你所有的Category的头文件包含到类的主头文件或者主实现文件中,并且直接在你的类的主实现文件中去import你的各个Category的实现文件。这样,编译器在链入你的类的主方法时,你的各个Category实现由于被import到你的类主实现文件中,所以他可以找到你的Category方法,并将该方法链入目标文件。当然,这个方法不太优雅就是了。

第三种,就是你使用的是系统API某个类的Category,比如你为UILabel增加了个Category:UILabel(MyExtent).这个其实也很麻烦,刚开始也试了很多方法,网上的一些方法也试过,但是貌似还是不管用,最后换了个想法想,这个和自己类的Category有什么区别,貌似一样没区别阿。所以最后试了一下,只要找一个必定会使用的类,将Category的头文件和实现文件import到该类的主实现文件中,这样编译器就也能找到这些Category方法了。虽然一样解决了问题,还是那句话,一点都不优雅!

虽然最后终于都解决了这些问题,得出的结论还是,不要轻易在iPhone3.0及3.0以上的静态库中使用分文件的Category方法。但2.0的SDK编译的试验过无问题。

最后的吐槽是:Category作为一个Objective-C最特色的语法功能之一,居然无法正常的在静态库中使用,苹果你不觉得你很过分吗!这么严重的bug也不修复!你难道逼我写个1000行左右的类吗?有些类由于某些原因(不一定是技术原因)是不允许分拆成不同的类名!

小结:深度解析iPhone Category用法的内容介绍完了,希望本文对你有所帮助!

责任编辑:zhaolei 来源: 互联网
相关推荐

2011-08-02 18:07:03

iPhone 内省 Cocoa

2011-08-12 11:23:47

iPhone窗口视图

2011-07-18 14:23:40

iPhone 多任务

2011-07-27 17:02:12

Xcode iPhone 单元测试

2011-08-19 13:45:14

iPhone应用iPhone OS数据

2011-06-07 17:16:47

iPhone 数据

2011-08-12 14:54:45

iPhone委托

2011-07-29 14:55:25

iPhone开发 动画过渡

2011-08-11 17:00:33

iPhone数据库SQLite

2011-07-26 14:07:29

iPhone 二维码

2011-06-02 17:27:49

iphone 多线程

2011-08-02 17:14:41

iPhone应用 UITableVie

2024-01-11 12:14:31

Async线程池任务

2011-08-15 11:37:20

iPhone开发Mask

2021-11-09 23:08:20

iPhone手机安卓

2011-08-12 14:39:00

iPhoneSDK

2010-07-13 13:49:43

Perl foreac

2023-03-27 08:12:40

源码场景案例

2023-10-10 11:02:00

LSM Tree数据库

2011-08-19 14:47:48

iPhoneiPhone4iPad
点赞
收藏

51CTO技术栈公众号