应用工程使用分类
在应用工程中创建一个 NSString 的分类 NSString (test),分类中创建一个静态方法 + (void)testMethod;
NSString+test.h
#import
NS_ASSUME_NONNULL_BEGIN
@interface NSString (test)
+ (void)testMethod;
@end
NS_ASSUME_NONNULL_END
NSString+test.m
#import "NSString+test.h"
@implementation NSString (test)
+ (void)testMethod{
NSLog(@"testMethod");
}
@end
ViewController.m
#import "ViewController.h"
#import "NSString+test.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[NSString testMethod];
}
@end
未设置 -ObjC
正常运行
运行,在未添加 -ObjC 的情况下,Demo 工程是可以正常使用分类的。
使用 nm 命令查看 Demo 的二进制文件,发现分类方法有链接到:
分类正常链接
静态库使用分类
在静态库中创建一个 NSBundle 的分类 NSBundle (NiceSDKBundle),用于静态库中读取资源文件。
NSBundle+NiceSDKBundle.h
#import
NS_ASSUME_NONNULL_BEGIN
@interface NSBundle (NiceSDKBundle)
+ (UIImage*)getNiceBundleImageWithName:(NSString*)name;
@end
NS_ASSUME_NONNULL_END
NSBundle+NiceSDKBundle.m
#import "NSBundle+NiceSDKBundle.h"
@implementation NSBundle (NiceSDKBundle)
+ (NSString*)sdkBundlePath{
NSString *path = [[NSBundle mainBundle] pathForResource:@"NiceBundle"
ofType:@"bundle"];
return path;
}
+ (UIImage*)getNiceBundleImageWithName:(NSString*)name{
NSString *path = [[self sdkBundlePath] stringByAppendingPathComponent:name];
UIImage *image = [UIImage imageWithContentsOfFile:path];
return image;
}
@end
此时静态库工程未设置 -ObjC
静态库工程未设置 -ObjC
打包编译此静态库,使用 nm 命令查看,分类符号是存在于该二进制文件中的
分类符号存在
应用工程使用包含分类的静态库
静态库工程:
NiceSDKAPI.h
#import
NS_ASSUME_NONNULL_BEGIN
@interface NiceSDKAPI : NSObject
+ (instancetype)shareInstance;
- (void)test;
- (void)getImage;
@end
NS_ASSUME_NONNULL_END
NiceSDKAPI.m
#import "NiceSDKAPI.h"
#import "NSBundle+NiceSDKBundle.h"
@implementation NiceSDKAPI
+ (instancetype)shareInstance{
static NiceSDKAPI *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[NiceSDKAPI alloc]init];
});
return instance;
}
- (instancetype)init
{
self = [super init];
if (self) {
}
return self;
}
- (void)test{
NSLog(@"NiceSDK test interface");
}
- (void)getImage{
// 获取 bundle image
UIImage *image = [NSBundle getNiceBundleImageWithName:@"joy_btn_apple_login.png"];
NSLog(@"%@",image);
}
@end
应用工程:
ViewController.m
#import "ViewController.h"
//#import "NSString+test.h"
// 导入 NiceSDK
#import
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
// [NSString testMethod];
// 调用 SDK getImage 接口
[[NiceSDKAPI shareInstance]getImage];
}
@end
unrecognized selector sent to class
使用 nm 命令查看:
只有应用工程本身添加的分类
这时候将应用工程的 Other Linker Flags 加上 -ObjC,就能正常运行了:
应用工程加上-ObjC 正常运行
静态库使用的分类也被链接进来了!
总结
1、应用工程,使用自身工程添加的分类,无需加 -ObjC;
2、静态库工程,使用自身工程添加的分类,无需加 -ObjC;
3、应用工程,使用静态库所添加的分类,应用工程需要添加-ObjC。
参考
官方说明
看懂请随手点赞,朋友们!