iOS中的静态库和动态库

概念

静态库(Static Library)
.a 为后缀,它是你的源码的实现.m文件编译而成的二进制文件集合,需要配合上暴漏的.h文件使用,它在引用链接时拷贝至可执行文件中,程序运行时加载到内存,期间被多次使用就有多份冗余拷贝和加载;
动态库(Dynamic Framework)
.dylib.framework为后缀,也是一堆.h和.m的集合,.m同样被编译成了二进制,不同的是,它还可以包含nib文件,资源文件等,系统的framework在链接时先检查内存中是否已经加载,如果有,就不再进行复制,这样多个应用程序可以共享内存中得同一份库文件,节省了内存.

注意:
1.在iOS8之前,或者xcode6之前,你可能也见过开发者自己打包的framework,具体方法可以看这里这里,但是,这些辛苦打包出来的framework依然是静态库的形式(程序运行时被加载到内存,即便此时内存中其他应用也用了此framework并且已经加载进内存了);
2.系统的.framework是动态库,也就是说我们代码中最常见的#import <Foundation/Foundation.h>导入的foundation框架,当我们运行程序的时候,其实内存中已经预加载了这些系统框架,此时我们打开应用时不会再次加载这些,这就减少了内存的占用.虽然在xcode6之后苹果爸爸允许我们自己生成framework了,但是,它依然只是存在于当前应用的沙盒中而非提交到系统中,这就意味着每次依然会加载到内存中...

创建自己的framework

相比较于静态库,动态库有着自己的优势,除去上文中说道的资源包含和内存加载问题,在使用的时候相比较于.a的静态库也更方便,因为它本省包含了我们所需要的所有资源(自包含);所以我建议,我们更应该生成动态framework而非.a静态库;

为已有类扩展分类使我们经常的做法,现在我们将实例如何将分类打包成framework使用;
1.新建工程->选择iOS下Framework&Library->CocoaTouch Framework;

2.将我们的要打包的文件拖进工程,这里不要建立文件夹(图1);

可以看到这里有一个额外的文件XCommonExtension.h,它在我们生成工程之后自动为我们生成,这里你可以将打包的public文件都通过import的方式导入头文件到这里,在其他开发者使用framework的时候只用引用这个.h头文件即可;

3.在build phases中,我们可以看到有一个Headers的选项,我们上一步添加的文件都会在这里显示,不过默认的是在project下,这里我们需要把需要暴露的拖动到public下,完成后如下(图2)

4.Build-Run,到此,你的""模拟器版""的framework已经生成了,它只能在模拟器中链接引用,到真机运行的时候就有问题了,接下来,我们在生成真机版的framework,同时把他们合并成一个通用的framework;

5.选中target->在工具栏点击Editor->Add Target->在弹出的选择框中选择Other->Aggregate->Next;现在你的工程总有了两个target(图3)

6.选中刚加入的这个target,点击右上的 + 号 -> New Run Script Phase,我们将在这里嵌入我们的脚本script;

嵌入以下脚本:

# Sets the target folders and the final framework product.
# 如果工程名称和Framework的Target名称不一样的话,要自定义FMKNAME
# 例如: FMK_NAME = "MyFramework"
FMK_NAME=${PROJECT_NAME}
# Install dir will be the final output to the framework.
# The following line create it in the root folder of the current project.
INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework
# Working dir will be deleted after the framework creation.
WRK_DIR=build
DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework
SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework
# -configuration ${CONFIGURATION}
# Clean and Building both architectures.
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean build
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator clean build
# Cleaning the oldest.
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
cp -R "${SIMULATOR_DIR}/" "${INSTALL_DIR}/"
# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.
lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}"
rm -r "${WRK_DIR}"
open "${INSTALL_DIR}"

7.选中新加入的这个Scheme,编译运行(图4);

8.编译运行之后你的finder就会弹出生成的framework,找到并拷贝出来,大功告成,下面我们就可以使用它了;

使用我们的framework

9.在新建的工程中加入我们生成的framework,在Embedded Framework中加入我们的framework,在要使用的文件中引入头文件;

import <XCommonExtension/XCommonExtension.h>

注意:
1.这里我们打包的为分类,在使用的时候,需要在other linker flag中添加-ObjC或者-force_load参数;
2.带有图片资源的需要把图片打包成Bundle文件,和framework一起拷贝到相应的项目中.

到此为止,我们制作出来了可供使用的framework,如果想要更多人使用到你的framework,你可以利用cocoaPods,编写自己的PodSpec文件,或者利用Carthage,发布你的framework;

可能导入会存在问题,这里我就一直报错没有这个库文件,可很多方法都试了还是报错.(遗留问题吧!!!)不过framework还是打包成功的.

有知道的可以邮件联系我哟!!

使用XCode7打包动态库(Framework)的更多相关文章

  1. WWDC2014之iOS使用动态库 framework【转】

    from:http://www.cocoachina.com/industry/20140613/8810.html JUN 12TH, 2014 苹果的开放态度 WWDC2014上发布的Xcode6 ...

  2. 如何打包静态库.framework文件 iOS

    代码调试好了开始打包成sdk,下面是将要打包的FRSDK代码(FRSDK.h暴露在外面有别人调用) 1.创建新工程(Xcode File-New-Project) 2.把下面的红色框的东西移除 3.将 ...

  3. iOS - swift 后使用打包动态库

    WWDC2014上发布的Xcode6 beta版有了不少更新,其中令我惊讶的一个是苹果在iOS上开放了动态库,在Xcode6 Beta版的更新文档中是这样描述的: Frameworks for iOS ...

  4. iOS 开发新版 动态库framework

    0. 参考 http://www.cocoachina.com/industry/20140613/8810.html framework+xib参考 : http://blog.csdn.net/x ...

  5. 动态库 Framework

    framework的建立和生成 都比较简单.重点会放在第三块上面(指令集说明及合并) 1.framework target建立 1.1. command + shift + N 选取 ios -> ...

  6. C 语言与动态库相关基础知识

    1.导入文件<>和“”的区别 #include <xxx.h>导入的是标准目录下的.h文件,所谓的标准目录指的是:/use/local/include(一般是第三方头文件)以及 ...

  7. 静态库 VS 动态库

    如何得到库 ①先写好一堆的.c文件(.c:我们所需要的各种工具函数) ②将这些.c编译为对应的.o ③将所有的这些.o打包为一个仓库文件(静态库或者动态库) 静态库:按照静态库的方式打包 动态库:按照 ...

  8. Linux之动态库

    命令规则 lib + 名字 + .so 制作步骤 1)生成与位置无关的代码(生成与位置无关的代码) 2)将.o打包成共享库(动态库) 发布和使用共享库 动态库运行原理: 生成动态库: gcc -fPI ...

  9. iOS 使用 Xcode8 制作动态库及静态库

    在使用第三方 SDK 时,经常遇到他们提供的仅仅只有一个动态或静态库,并不能获取源码.使用动态库 FrameWork 或 静态库 Lib,可以满足不想把核心代码的具体实现向使用者展示,又能避免其他人错 ...

随机推荐

  1. php 生成gif 动图,可控制每张图时间

    <?php //namespace gifCreator; /** * Create an animated GIF from multiple images */ class gifcreat ...

  2. 数据库—Innodb中的MVVC

    文章:Innodb中的MVVC 地址:https://www.jianshu.com/p/7e967d291c24

  3. Codeforces 729D Sea Battle(简单思维题)

    http://codeforces.com/contest/738/problem/D https://www.cnblogs.com/flipped/p/6086615.html   原 题意:海战 ...

  4. Derby数据库操作 常见错误和异常

    一.插入(INSERT时报错) 1.错误:java.sql.SQLIntegrityConstraintViolationException: 列“test”无法接受空值. 可能原因:建表时test列 ...

  5. evpp http server定制实现

    evpp http server定制实现 evpp http server定制实现 evpp http server定制实现

  6. css选择器学习(二)属性选择器

    属性选择器 /*******************************************css2中的属性选择器*************************************** ...

  7. Linux使用帮助详解

    主要内容:                    whatis                    command --help                     man and info   ...

  8. 一款超好用的第三方评论插件--Gittalk

    使用GITALK的背景: 1. 最近在做一个基于Java的个人博客系统,已经基本完工了,突然发现怎么没有评论的操作,如果再从头开始从数据库开始写的话,花费的代价有点大,于是乎我就在网上寻找一款适合我的 ...

  9. 04_Returners组件:返回jobid的结果到mysql

    1.前期调研 0.环境 salt 2019 python3.6  很重要 [root@IP ~]# salt-call --versions-report Salt Version: Salt: 20 ...

  10. Python 10--模块

    可以在模块中,直接使用__file__,识别出该模块文件的路径. print __file__