Objective-C靜態庫中含有category怎麼辦?

來源:互聯網
上載者:User

標籤:objective-c   蘋果   category   library   

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靜態庫中含有category怎麼辦?

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.