组件化组件静态库动态库加载xib资源的区别

动态库形式:.dylib和.framework
静态库形式:.a和.framework
举例demo:demoStatic


动态库和静态库的区别

1、动态库情况xib资源存在路径

iOS在组件化过程中,一般来说,会把组件做成动态库的形式,也就是使用use_frameworks!

图1
这种情况下,无论你的xib放到Assets资源文件夹下还是Classes代码文件夹下,系统都可以通过该组件的framework找到,如下图
图2

那么app运行起来之后,当app需要加载xib资源,会从demoStatic.framework这个动态库中寻找,如果xib资源放在了Assets文件夹下,那么系统应该从demoStatic.bundle里面找xib资源;如果xib资源放在了Classes文件夹下,那么系统应该直接从demoStatic.framework里面找(即demoStatic.bundle同级目录)。
下图为demoStatic_Example.app的包内容(静态库和动态库两种情况,此时的xib资源都在Assets文件夹下,所以xib的资源都应该在demoStatic.bundle里面找,只是不同情况demoStatic.bundle的位置不同)
图3|动态库|Assets

图3|静态库|Assets

图3|动态库|Classes
但是如果在podspec文件中声明s.static_framework = true,如下图
图4
说明demoStatic组件允许打包成静态库,这样的话,demoStatic_Example.app包内容的Frameworks路径下就没有demoStatic.framework,所以这种情况下,必须把xib资源放到Assets文件夹下(参考图3|静态库)[因为静态库的组件中,它的bundle路径在demoStatic_Example.app下]。为了和图片资源区分清楚,尽量在podSpec文件下指明路径,参考图4的s.source_bundles
下面我写了一个加载Assets文件夹下xib资源的方法

#import "NSBundle+Xib.h"

@implementation NSBundle (Xib)
///这是NSBundle的Category
/// 如果xib文件放到了Assets文件夹下使用这个方法获取xib所在bundle(兼容静态库和动态库)
/// @param bundleName bundle名称
+ (instancetype)yl_xibWithBundle:(NSString *)bundleName {
        
        
    if ([bundleName containsString:@".bundle"]) {
        bundleName = [bundleName componentsSeparatedByString:@".bundle"].firstObject;
    }
    NSBundle *lastBundle = nil;
    //没使用framwork的情况下(静态库)
    NSURL *associateBundleURL = [[NSBundle mainBundle] URLForResource:bundleName withExtension:@"bundle"];
    
    //使用framework形式(动态库)
    if (!associateBundleURL) {
        associateBundleURL = [[NSBundle mainBundle] URLForResource:@"Frameworks" withExtension:nil];
        associateBundleURL = [associateBundleURL URLByAppendingPathComponent:bundleName];
        associateBundleURL = [associateBundleURL URLByAppendingPathExtension:@"framework"];
        associateBundleURL = [associateBundleURL URLByAppendingPathComponent:bundleName];
        associateBundleURL = [associateBundleURL URLByAppendingPathExtension:@"bundle"];
        
    }
    
    lastBundle = [NSBundle bundleWithURL:associateBundleURL];
    
    return lastBundle;

}
@end

你可能感兴趣的:(组件化组件静态库动态库加载xib资源的区别)