美文网首页
组件化组件静态库动态库加载xib资源的区别

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

作者: 球球ol | 来源:发表于2021-04-12 11:01 被阅读0次

    动态库形式:.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资源的区别

          本文链接:https://www.haomeiwen.com/subject/myeukltx.html