标签:objective-c 苹果 category library
找到 target,更改其 Other Linker Flags 为: -all_load 或 -force_load
-force_load,后跟随一个文件位置,可以更精确地加载所需文件。 简单点说就是,Objective-C 的动态特性使得需要,为链接器添加一个标签(设置 Other Linker Flags 为 -ObjC)来解决通过 Category
向类添加方法的问题。 但这个标签 -ObjC 在 64 位 和 iOS 中有问题,需要使用 -all_load 或 -force_load。
缺点:会将所有的符号都导入进来,造成库比较大。
在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 苹果 category library
原文地址:http://blog.csdn.net/shaozg168/article/details/47178859