• 静态库


    什么是库?
    库是程序代码的集合,是共享程序代码的一种方式
    
    根据源代码的公开情况,库可以分为2种类型
    开源库
    公开源代码,能看到具体实现
    比如SDWebImage、AFNetworking
    
    闭源库
    不公开源代码,是经过编译后的二进制文件,看不到具体实现
    主要分为:静态库、动态库
    
    静态库和动态库的存在形式
    静态库:.a 和 .framework
    动态库:.dylib 和 .framework
    
    静态库和动态库在使用上的区别
    静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝(左图所示)
    动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存
    
    需要注意的是:
    项目中如果使用了自制的动态库,不能被上传到AppStore

    静态库制作

    编写业务类:

    //
    //  HJTool.h
    //  static
    //
    //  Created by HJiang on 15/3/23.
    //  Copyright (c) 2015年 HJiang. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    
    @interface HJTool : NSObject
    
    + (NSInteger)sumNum1:(NSInteger)num1 num2:(NSInteger)num2;
    
    @end
    //
    //  HJTool.m
    //  static
    //
    //  Created by HJiang on 15/3/23.
    //  Copyright (c) 2015年 HJiang. All rights reserved.
    //
    
    #import "HJTool.h"
    
    @implementation HJTool
    
    + (NSInteger)sumNum1:(NSInteger)num1 num2:(NSInteger)num2{
        return num1 + num2;
    }
    
    @end

    编译项目:

    command+B,得到.a和暴露的.h文件

    新建测试静态项目

    测试通过

    使用模拟器iphone4s测试

    解决办法:
    方法1: 修改静态库项目中的配置(可以生成支持i386和x86_64 2个版本的.a文件)
        项目> target -> Build settings -> Combined -> Architectures ->Build Active Architecture Only -> 修改Debug为NO
    方法2:把i386和x86_64的2个静态库文件合成一个静态库使用
    静态库的合并
    ================================================================================
    
    # 检测.a的类型
    $ lipo -info libHJTools.a
    
    # 合并.a
    lipo -create Debug-iphoneos/libTools.a Debug-iphonesimulator/libTools.a -output libTools.a
    
    # 合并.a的好处,开发过程中既可以在真机上调试,也可以在模拟器上调试
    # 合并.a的坏处,如果静态库太大,合并打包后,会非常大,因此很多第三方的静态库的.a是区分版本的
    # 今后在使用.a时一定注意版本

    把静态库项目配置修改重写编译

    重写导入新的.a文件运行在iphone4s正常

    /*

     Undefined symbols for architecture i386:

     静态库不能在使用i386架构的cpu设备上面运行

     

    模拟器架构:

     i386 : iPhone模拟器 3gs->iPhone5

     x86_64 : iPhone模拟器 5s->6plus

    查看.a架构命令 

     lipo -info 静态库:查看该静态库支持哪些架构

     

    真机架构

     armv7 : iPhone 3gs->4s

     armv7s : iPhone 5->5c 

     arm64 : iPhone 5s->6plus

     */

    笔记:

    问题一: 静态库.a文件始终为红色,显示编译不成功。
    
    解决办法:这是xcode的一个bug,先将编译模式设置为device,编译成功,再切换回simulator模式即可编译simulator对应的.a文件
    
    新建静态库项目
    
    1.编译项目,获取.a文件,如需暴露.h文件,再项目->target->Build Phases->Copy Files->导入需要暴露的头文件和.m文件(一般只暴露.h文件)
    
    在其他项目中导入静态库就可以使用静态库
    2.如果是生成的x86_64的静态库,在i386处理器上运行会出现异常
    解决办法:
    方法1: 修改静态库项目中的配置(可以生成支持i386和x86_64 2个版本的.a文件)
        项目> target -> Build settings -> Combined -> Architectures ->Build Active Architecture Only -> 修改Debug为NO
    方法2:把i386和x86_64的2个静态库文件合成一个静态库使用
    静态库的合并
    ================================================================================
    
    # 检测.a的类型
    $ lipo -info libHJTools.a
    
    # 合并.a
    lipo -create Debug-iphoneos/libTools.a Debug-iphonesimulator/libTools.a -output libTools.a
    
    # 合并.a的好处,开发过程中既可以在真机上调试,也可以在模拟器上调试
    # 合并.a的坏处,如果静态库太大,合并打包后,会非常大,因此很多第三方的静态库的.a是区分版本的
    # 今后在使用.a时一定注意版本
    
    3.生成调试和正式版本
    选择项目 > Edit Scheme >Run > info >Build configuration >Debug|Release
    这样选择后就可以生成调试或正式版本(发布或调试).a信息

    静态库的种类

    ================================================================================

    静态库文件的版本(4种)

    1.真机-Debug版本

    2.真机-Release版本

    3.模拟器-Debug版本

    4.模拟器-Release版本

    调试版本(Debug版本) VS 发布版本(Release版本)

    --------------------------------------------------------------------------------

    - 调试版本会包含完整的符号信息,以方便调试

    - 调试版本不会对代码进行优化

    - 发布版本不会包含完整的符号信息

    - 发布版本的执行代码是进行过优化的

    - 发布版本的大小会比调试版本的略小

    - 在执行速度方面,调试版本会更快些,但不意味着会有显著的提升

    
    二.在application项目中添加静态库项目
    1.项目- >Target>左下角 添加静态库项目>
    2.项目-》target>添加frameWork(指定.a文件)
    
    
    动态库
    1.新建动态库
    
    2.添加动态库至项目中
      2.1 修改动态库的导入 - 删除target>general>Linked framework
        添加二进制文件 ->Embedded Binaries >导入动态库
    
    #warning
    在制作库时,图片等资源不会包括在.a库中(所以制作库时,库中使用到的资源也需要单独和库一起发布出来)
    需要在导入库到项目中时还需要导入资源文件
    资源文件需要库提供者一起提供出来
    

    静态库中的资源包的使用

    ================================================================================

    问题:有些第三方库会使用到一些图片素材,例如公司的logo等。

    
    

    但是由于Xcode默认在编译时会把所有的素材文件导入到mainBundle中,为了避免与使用静态库的程序冲突。

    
    

    在静态库中如果要使用图片素材,会利用bundle的手段

    1>  建立bundle,并且向其中添加图片

    
    

    2>  创建一个类方法,返回图片

    
    

    3>  编译

    
    

    4>  调用方如果需要使用,需要导入 .h + .a + XXX.bundle

    
    Bundle资源
    怎么制作bundle?
    新建文件夹>把文件夹后缀修改为Bundle
    显示bundle文件内容,把资源放入就可以了
  • 相关阅读:
    iOS_UIImage的方向(imageOrientation)
    iOS-LaunchImage启动页
    iOS_UIImage_毛玻璃效果
    iOS_常用C语言函数
    iOS_UIImage_Gif的合成
    iOS_UIImage_Gif的分解
    iOS_UIImge_Gif的展示
    iOS_UIImage_jpg<-->png转换
    Mysql学习第三天
    Mysql学习第二天
  • 原文地址:https://www.cnblogs.com/HJiang/p/4359340.html
Copyright © 2020-2023  润新知