Objective-C静态库中含有category怎么办?
2015-08-01 00:31
543 查看
1、苹果推荐的方法
找到 target,更改其 Other Linker Flags 为: -all_load 或 -force_load-force_load,后跟随一个文件位置,可以更精确地加载所需文件。 简单点说就是,Objective-C 的动态特性使得需要,为链接器添加一个标签(设置 Other Linker Flags 为 -ObjC)来解决通过 Category
向类添加方法的问题。 但这个标签 -ObjC 在 64 位 和 iOS 中有问题,需要使用 -all_load 或 -force_load。
缺点:会将所有的符号都导入进来,造成库比较大。
2、我的方法
在category声明的地方添加一个类,然后随便实现一个方法,然后在target中调用这个category中类的方法。但是如果有很多category的话一个一个添加比较麻烦,所以呢,我直接定义了几个宏来简化操作。宏定义如下:
// // FixCategoryBug.h // MainLib // // Created by shaozg on 15/7/31. // Copyright (c) 2015年 shaozg. All rights reserved. // #ifndef MainLib_FixCategoryBug_h #define MainLib_FixCategoryBug_h #define __kw_to_string_1(x) #x #define __kw_to_string(x) __kw_to_string_1(x) // 需要在有category的头文件中调用,例如 KW_FIX_CATEGORY_BUG_H(NSString_Extented) #define KW_FIX_CATEGORY_BUG_H(name) \ @interface KW_FIX_CATEGORY_BUG_##name : NSObject \ +(void)print; \ @end // 需要在有category的源文件中调用,例如 KW_FIX_CATEGORY_BUG_M(NSString_Extented) #define KW_FIX_CATEGORY_BUG_M(name) \ @implementation KW_FIX_CATEGORY_BUG_##name \ + (void)print { \ NSLog(@"[Enable category %s]", __kw_to_string(name)); \ } \ @end \ // 在target中启用这个宏,其实就是调用下category中定义的类的print方法。 #define KW_ENABLE_CATEGORY(name) [KW_FIX_CATEGORY_BUG_##name print] #endif
NSString+Extented.h如下:
// // NSString+Extented.h // MainLib // // Created by shaozg on 15/7/31. // Copyright (c) 2015年 shaozg. All rights reserved. // #import <Foundation/Foundation.h> #import "FixCategoryBug.h" KW_FIX_CATEGORY_BUG_H(NSString_Extented) @interface NSString (Extented) - (NSString *)testCategory; @end
NSString+Extented.m内如如下:
// // NSString+Extented.m // MainLib // // Created by shaozg on 15/7/31. // Copyright (c) 2015年 shaozg. All rights reserved. // #import "NSString+Extented.h" KW_FIX_CATEGORY_BUG_M(NSString_Extented) @implementation NSString (Extented) - (NSString *)testCategory { return self; } @end
需要调用category的其它target部分代码如下:
#import "AppDelegate.h" #import "MainLib.h" #import "NSString+Extented.h" #import "SubLib.h" @interface AppDelegate () @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. // ENABLE_CATEGORY(NSString); KW_ENABLE_CATEGORY(NSString_Extented); NSLog(@"不会出错了吧? %@", [@"当然!" testCategory]); return YES; }
优点:使用简单,根本不用改编译选项;也不会增加库的体积。
缺点:没有缺点
如果小伙伴们有更简单的方法,请一定分享吧!
相关文章推荐
- (转载)Objective-c的@property 详解
- objectiveC【语法】修饰符 static extern const
- Objective-C类和对象
- Objects and Data Structures
- 快速上手Gobject
- Objective-C id类型实现原理
- Objective-C id类型实现原理
- TMCache: fast object caching for iOS & OS X
- [Object-C]正则表达式 手机号, 邮箱, 车牌号
- [Object-C]使用个推遇到的坑
- Object类
- Flash <object>标签含义解析
- jquery 将 json字符串转成js object
- 0808-080x OBJECT
- Object-C 中的日期(NSDate)
- [Object-c]cocoaPods 安装及遇到问题处理方法
- 黑马程序员--iOS--Objective-C基础 (Foundation框架 一 )
- 编译报错:Undefined symbols for architecture x86_64
- Object-C 中的NSData / NSMutableData
- objective-c 编程的几个调试技巧