Objective-C静态库中含有category怎么办?

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 

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

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

如果小伙伴们有更简单的方法,请一定分享吧!

你可能感兴趣的:(iOS)