zoukankan      html  css  js  c++  java
  • iOS静态库 ---iOS-Apple苹果官方文档翻译

    iOS静态库 ---iOS-Apple苹果官方文档翻译

     怎么用? 

    是什么? 
    1什么是库? 库是共享程序代码的方式,一般分为静态库和动态库。 2静态库与动态库的区别? 静态库:链接时完整地拷贝至可执行文件中,被多次使⽤用就 有多份冗余拷⻉贝。 动态库:链接时不复制,程序运行时由系统动态加载到内存, 供程序调用,系统只加载一次,多个程序共用,节省内存。 3iOS里静态库形式?
    .a.framework
    4iOS
    里动态库形式?
    .dylib.framework

    是什么? 
    5.framework为什么既是静态库又是动态库? 系统的.framework是动态库,我们自己建立的.framework是静 态库。
    6.a.framework有什么区别?
    区别不是很大。
     .a是一个纯二进制文件,.framework中除了有二进制文件之外还 有资源文件。 .a文件不能直接使用,至少要有.h文件配合,.framework文件可 以直接使用(.h等资源已经在其内部,图片资源一般再打一 个.bundle文件)。
    .a + .h + sourceFile = .framework
    建议用
    .framework.

    是什么? 

    为什么? 
    1为什么要使用静态库?
     方便共享代码,便于合理使用。 
     实现iOS程序的模块化。可以把固定的业务模块化成静态 
    库。 
     和别人分享你的代码库,但不想让别人看到你代码的实现。 
     开发第三方sdk的需要。 


    怎么做? 
    制作.a静态库 制作.framework静态库(手工法) 制作.framework静态库(模板法)

    怎么做?--制作.a静态库 
    新建工程,选择iOSFramework & LibraryCocoa Touch Static Library


    怎么做?--制作.a静态库 
    点击next输入项目名称(这里举例子用MFKit)


    怎么做?--制作.a静态库 
    点击next,点击create创建工程



    怎么做?--制作.a静态库 
    添加需要的方法(这里是testKit)并在.h中实现


    怎么做?--制作.a静态库 或者添加新类(这里是MFClass)并添加方法,加以实现


    怎么做?--制作.a静态库 
    点击MFKit工程文件,选择target下的BuildPhases->Copy Files->+


    怎么做?--制作.a静态库 
    选择要暴露出来的.h文件,点击添加。不需要暴露的文件,就 不用添加.h,但其.m是会被编译到.a里的。


    怎么做?--制作.a静态库 
    command + B编译,编译后libMFKit.a文件会变成黑色


    怎么做?--制作.a静态库 
    选择模拟器再次编译(真机和模拟器需要运行的.a文件是分开
    的)
    选择
    libMFKit.a文件右键,show in finder


    怎么做?--制作.a静态库 
    运行模拟器,要用模拟器文件夹下的.a,运行真机的话,要用 真机文件夹下的.a,除此之外还可以讲两个.a文件合并成一 个.a,合并后的.a在模拟器和真机下都能运行。具体方法终端 下运行:lipo -create xxx/xxx/xx.a xxx/xxxx/xxx.a - output xx/xx/xx.a


    怎么做?--制作.a静态库 
    注意每个文件要带绝对路径,为了方便我们一般都把要合并的
    文件放在一个文件夹里,生成的文件也放在这个文件夹里,上
    面的例子是在桌面上完成的。


    怎么做?--制作.framework静态库(手工法) 
    与制作.a静态库 一样,先建立一 个基于.a的工程 (这里是 FQKit)。删除 FQKit这个 target,当然也 可以删除Test相 对应的Target


    怎么做?--制作.framework静态库(手工法) 


    怎么做?--制作.framework静态库(手工法) 
    添加一个target


    怎么做?--制作.framework静态库(手工法) 
    配置环境变量:
    选中Target->Build Settings
    Architecture
    Base SDK 从“Latest OS X(OS X 10.8)”改为 Lastest iOS(iOS 7.0)”
    Architecture 改为 Standard(armv7) Deployment
    OS X deployment target 修改为“compiler Default
    Target Device Family 修改为需要的,这⾥里我改为了“iPhone

    怎么做?--制作.framework静态库(手工法) 
    Linking下:Dead Code Striping 改为 NO
    Link with Standard Libraries 改为“NO Mac-O type改为 Relocatable Object File

    怎么做?--制作.framework静态库(手工法) 
    Packaging下:Wrapper Extension改为“framework
    1. 修改⽬目标的info
    Bundle OS Type Code修改为“FMWK 2. 修改预编译头NetGameFrameworkPrefix.pch 注释掉
    #ifdef __OBJC__
    #import 

    #endif

    怎么做?--制作.framework静态库(手工法) 
    配置完环境变量就可以像用.a一样,向其中添加需要使用的类 和方法了。添加完类和方法后,添加add copy header Build Phase,然后像其中添加头文件

    怎么做?--制作.framework静态库(手工法) 


    怎么做?--制作.framework静态库(手工法) 


    怎么做?--制作.framework静态库(手工法) 


    怎么做?--制作.framework静态库(手工法) 

    这里的原理和生成.a静态库的原理一样,编译后需要暴露的.h 文件就会在.framework中出现。然后也是分模拟器和真机编 译,也可以用lipo把两者合二为一。
    怎么做?--制作.framework静态库(手工法) 


    怎么做?--制作.framework静态库(手工法) 
    注意此时用lipo处理的文件并不是xxx.framework,而是其 内部的二进制文件。


    怎么做?--制作.framework静态库(模板法) 
    .framework方法需要配置大量的环境变量,比较麻烦,其实 网上有个开源的模板叫做iosframework,下载压缩包,解压 后终端下安装install.sh,就可以直接生成.framework的工 程,其它的地方就可以参考我们上面讲的两种方法,但使用iosframework可能会有iOS版本间兼容的问题, 需要大家 注意,这里就不在赘述过多的方法了。 有兴趣的同学可以 google一下iosframework

    怎么做?--制作静态库时的几点注意 
    1注意理解:无论是.a静态库还.framework静态库,我们需要 的都是二进制文件+.h+其它资源文件的形式,不同的是,.a本 身就是二进制文件,需要我们自己配上.h和其它文件才能使用, 而.framework本身已经包含了.h和其它文件,可以直接使用 (图片资源接下来讨论) 2图片资源的处理:两种静态库,一般都是把图片文件单独的 放在一个xx.bundle文件中,一般xx.bundle的名字和.a .framework的名字相同。xx.bundle文件很好弄,新建一个 文件夹,把它改名为xx.bundle就可以了,右键,显示包内容 可以向其中添加图片资源(一会具体举例子)。

    怎么做?--制作静态库时的几点注意 
    3category是我们实际开发项目中经常用到的,把category打 成静态库是没有问题的,但是在用这个静态库的工程中,调用 category中的方法时会有找不到该方法的运行时错误 (selector not recognized ),解决办法是:在使用静态库的工程中配置other linker flags的值为-ObjC( 一会具体举例子)。

    怎么做?--制作静态库时的几点注意 
    4,如果一个静态库很复杂,需要暴露的.h比较多的话,就可 以在静态库的内部创建一个xx.h文件(一般这个xx.h文件的名 字和静态库的名字相同),然后把所有需要暴露出来的.h文件 都集中放在这个.h文件中,而那些原本需要暴露的.h都不需要 再暴露了,只需要把xx.h暴露出来就可以了。这样在用的时候 就方便很多了,只需要#import 就可以了, 实际上苹果本身就是这么做的,例如:!
    #import !

    怎么用? 
    方法1:把.framework或者.a拷贝到目标工程文件夹中,然后 添加到工程中(一般方在frameworks文件夹下),和使用其 他系统的库一样使用就可以了。 如果自己是开发sdk的开发人员,就会遇到一个问题,要准备 两个工程,一个sdk工程,一个测试工程,要测试sdk的话, 先要把sdk打包为静态库,然后再把静态库拷贝到测试工程中 测试,每次修改,都会做上述的冗余的工作,如何才能更方便 的开发自己的sdk?

    怎么用? 
    方法2:把framework的工程拷贝到要测试或者使用它的目标 工程中.


    怎么用? 
    打开目标工程,Frameworks文件夹上右键选择Add files to “xxx”,在刚刚导入的framework中把.xcodeproj文件加进来


    怎么用? 


    怎么用? 
    点击target下⾯面的Build Phases->Link Binary With Libraries- >"+",选择我们framework中的.framework⽂文件,然后添加.


    怎么用? 在要使用的地方加入framework的头文件(此处编译器没有自
    动提示,但不是错误)
    然后就可以用framework里的东西了,也可以直接改变 framework工程中的类,不用对该工程单独编译,直接运行目标 工程,就能看到变化.还可以断点调试.


    怎么用? 
    还有一个更简单的方法: 方法3:新建一个测试工程,添加一个开发sdktarget

    怎么用? 


    怎么用? 


    图中的1对应3中的 TestFFF.app,2对应3
    中的
    AniiiFMWK.framewor k 最重要的一步,还是把 framework工程中的 库,引入到目标工程中
    怎么用? 


    怎么用? 


    在用到的类中 引入framework 中对应的头文 件,就可以用了, 修改framework 的代码仍然不 用对它编译,直 接运行目标 target就能看到 变化,依然支持 断点调试.

    应用举例


    作者:
    出处:http://www.cnblogs.com/ChenYilong/(点击RSS订阅)
    本文版权归作者和博客园共有,欢迎转载,
    但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    JMS(面向消息中间件)
    ActiveMQ消息中间件知识汇总
    linux安装mysql常见命令
    结果集耗尽时,检查是否关闭结果集时常用sql
    Spring注解驱动开发之事务概念
    nginx 基础
    HTTP原理
    MYSQL----cmake 数据库出错
    php安装Phalcon模块
    docker报错 Failed to start Docker Application Container Engine.
  • 原文地址:https://www.cnblogs.com/ChenYilong/p/3556196.html
Copyright © 2011-2022 走看看