之前一直想要封装一个自己积累的“工具包”,以便日后搬砖家伙齐全一些,但是出于”懒“进而迟迟没有迈出第一步;最近对支付、数据持久化、动画将进一步学习与总结。
首先对整体的 iOS 的库有个整体的概念:
库是共享程序代码的方式,一般分为静态库和动态库。
静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。【.a和.framework】
动态库:链接时不复制,程序运行时系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。【.dylib和.framework】
注:系统的.framework是动态库,我们自己建立的.framework是静态库。
网上的相关资料有很多,主要参考进行学习,为方便记忆,主要以截图的方式进行记录:
创建新的工程 为做实例,简单的输出一个message 在此设置需要给外界暴露的.h,然后Run, 找到生成的Framework所在位置,导出用于新工程 存储路径如上 导入新的工程之后的目录结构 run --- crash在stackoverflow上找到关于Link binary 和 Embeb Framework 的区别,感觉原文更直接,就直接复制过过来了;
http://stackoverflow.com/questions/27015154/link-binary-with-libraries-vs-embed-frameworks
Link binary with libraries Linkframeworks and libraries with your project’s object files to produce a binaryfile. You can link a target’s source files against libraries in the target’sactive SDK or against external libraries.
Embed Frameworks You can create an embedded framework to share code between your app extension andits containing app.
在Embebdded Binaries中将自定义的Framework添加进去制作通用动态库,这一块目前还没有完全理解,先记录一下流程,
新建Aggregate Target
添加script到新建的Target
# 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}/"
# 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}"
选中新建的Target,Run, 如果没有异常的话,会自动弹出生成的Framework文件
这样生成的动态库就能同时支持模拟器和真机了
xCode6下制作通用静态库
上面我们也提到了,这样生成的动态库恐怕很难在xCode5上使用,那我们为什么非要用动态库呢,一般情况下不是用静态库就好了吗? So Easy!只需要修改一个参数即可生成静态库了
使用静态库的话,就可以把Framework从‘Embedded Binaries’中删除了. 亲测在xCode5下可用。把新生成的库导入到测试工程,试试在模拟器和真机上运行,一切OK.
不巧,如果你用的真机是iPhone5 C, 那悲剧又要发成了,生成的Framework竟然不支持armv7s,不知是xCode6的bug,还是因为苹果认为使用armv7s的设备太少,可以不支持了.xCode6新建工程,默认的Architectures竟然不包含armv7s
想要生成的库支持armv7s,把armv7s添加到Architectures中,重新生成Framework即可
判断一个Framework支持哪些架构
我们该怎么验证生成的Framework支持哪些平台呢,总不能一个个测试吧?当然不用.下面的命令是加上armv7s前后生成的framework的对比
Yearsdembp:Products Years$ lipo -info ./MyFramework.framework/MyFramework
Architectures in the fat file: ./MyFramework.framework/MyFramework are: i386 x86_64 armv7 arm64
Yearsdembp:Products Years$ lipo -info ./MyFramework.framework/MyFramework
Architectures in the fat file: ./MyFramework.framework/MyFramework are: armv7 armv7s i386 x86_64 arm64
1注意理解:无论是.a静态库还.framework静态库,我们需要的都是二进制文件+.h+其它资源文件的形式,不同的是,.a本身就是二进制文件,需要我们自己配上.h和其它文件才能使用,而.framework本身已经包含了.h和其它文件,可以直接使用。
2图片资源的处理:两种静态库,一般都是把图片文件单独的放在一个.bundle文件中,一般.bundle的名字和.a或.framework的名字相同。.bundle文件很好弄,新建一个文件夹,把它改名为.bundle就可以了,右键,显示包内容可以向其中添加图片资源。
3 category是我们实际开发项目中经常用到的,把category打成静态库是没有问题的,但是在用这个静态库的工程中,调用category中的方法时会有找不到该方法的运行时错误(selector not recognized),解决办法是:在使用静态库的工程中配置other
linker flags的值为-ObjC 。(注:一些第三方库里对系统库的类加了category;这时,就需要使用编译参数:-ObjC,这样第三方库中对系统类作的扩展方法才能在工程中使用)
4如果一个静态库很复杂,需要暴露的.h比较多的话,就可以在静态库的内部创建一个.h文件(一般这个.h文件的名字和静态库的名字相同),然后把所有需要暴露出来的.h文件都集中放在这个.h文件中,而那些原本需要暴露的.h都不需要再暴露了,只需要把.h暴露出来就可以了。
接下来对github的本地仓库与远程仓库进行总结,代码总的有个归宿。。。。利人利己
更多精彩内容请关注“IT实战联盟”哦~~~
![IT实战联盟.jpg](http:https://img.haomeiwen.com/i326255/f67b0f0dd5fe5874.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/500)
网友评论