iOS:Other Linker Flags 之 -ObjC

应用工程使用分类

在应用工程中创建一个 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。

参考

官方说明

看懂请随手点赞,朋友们!

你可能感兴趣的:(iOS:Other Linker Flags 之 -ObjC)