您的位置:首页 > 移动开发 > Objective-C

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;
}


优点:使用简单,根本不用改编译选项;也不会增加库的体积。

缺点:没有缺点

如果小伙伴们有更简单的方法,请一定分享吧!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: