什么是库?
现有的、成熟的可以复用的代码,程序代码的集合,共享程序代码的一种方式。
库的分类
根据程序代码的开源情况,库可以分为两类:1、 开源库
2 、闭源库
。
开源库可看见代码实现。如gitHub上的AFN和SDWebImage。
闭源库只公开调用的接口看不到具体的实现
,编译后的二进制文件。
闭源库进一步可分为两类:静态库
和动态库
。又称静态链接方式
和动态链接方式
。
iOS静态库与动态库的区别?
静态库:链接时会被完整的复制
到可执行文件中,被多次使用就有多份拷贝。
动态库:链接时不复制
,程序运行时由系统动态加载到内存,系统只加载一次,多个程序共用,节省内存
。
如何将程序编译成可执行文件?
通过命令查看可执行文件
打开终端
clang
clang的帮助命令为man clang 来查看clang的相关语法
clang -ccc-print-phases main.m
即可查看bianyicheng可执行文件的步骤。
如下图:
换言之:源代码->预处理器->编译器->汇编->机器码->链接->可执行文件
静态库与动态库打包
静态库.a文件
注意:红色表示没有生成静态库
command+B 编译
如图所示:生成成功
屏幕快照 2019-06-17 下午4.29.41.png
如何查询静态库是否支持模拟器或真机?
lipo -info
静态库framework文件
注意:红色表示没有生成静态库
屏幕快照 2019-06-17 下午6.03.35.png
command+B 编译
如图所示:生成成功
屏幕快照 2019-06-18 上午10.52.06.png
动态库framework生成
动态库framework生成与静态库唯一的区别在于 BuildSettings里的mach动态库默认为Dynamic Library 生成静态库时需要修改
再者应用动态库framework 与静态库framework的区别,如下图
注意:swift只支持动态库
内存优化
检测内存优化的一般方法:
1、静态检测方法
2、动态监测方法instruments
3、dealloc
4、第三方自动监测库
如何解决和检查内存问题?
1、野指针
一般来说EXC_BAD_ACCESS是野指针引起的崩溃,但具体定位不到准确的位置。
定位具体代码步骤如下:
屏幕快照 2019-06-18 下午1.16.44.png
屏幕快照 2019-06-18 下午1.17.21.png
看控制台左右地址数据定位问题所在:
屏幕快照 2019-06-18 下午1.19.47.png
引申:assign与weak都是弱引用声明类型,最大区别在哪?
weak声明的变量对象释放后自动清空,赋值为nil。
assign声明的变量对象释放后不会自动赋值为nil,会造成野指针错误。
2、内存泄漏问题
检测内存泄漏的一般方法:
1、静态检测方法:手动和自动(循环引用问题使用静态分析方法无法检测出来)
1)自动检测快捷键:command+shift+b 或者如下图
i
2)自动检测方法:
项目是否需要开启请酌情处理 , 开启方式如下:
i
2、动态监测方法instruments
开启instrument的方法有很多,如长按运行按钮、product->profile->leaks->choose、Xcode->open developer tool->instruments。用时自行选择开启方式。
运行-> 定位:如图所示(循环引用问题)
image.png
3、析构方法打印看调没调用
当某个对象引用计数为0时,自动调用dealloc方法
4、第三方内存检测工具
pod 'MLeaksFinder','~>1.0.0' (基于runtime的检测机制)
runtime基本用法
1、用runtime改变变量值
案例:改变persion类里的name属性值
屏幕快照 2019-06-18 下午2.30.53.png
屏幕快照 2019-06-18 下午2.29.59.png
2、使用runtime交换方法
屏幕快照 2019-06-18 下午2.36.20.png
屏幕快照 2019-06-18 下午3.06.47.png
3、使用runtime添加方法
屏幕快照 2019-06-18 下午3.13.36.png
屏幕快照 2019-06-18 下午3.14.04.png
最后的调用测试:
屏幕快照 2019-06-18 下午3.16.53.png
4、使用runtime给分类拓展属性
创建分类
屏幕快照 2019-06-18 下午3.25.19.png
屏幕快照 2019-06-18 下午3.26.03.png
屏幕快照 2019-06-18 下午3.27.37.png
编译时没有问题
屏幕快照 2019-06-18 下午3.38.27.png
访问时崩溃报错
屏幕快照 2019-06-18 下午3.39.30.png
使用runtime给分类拓展属性
屏幕快照 2019-06-18 下午3.42.51.png
swift简单运用
给一个数组,要求用swift写一个函数,交换数组中的两个元素
屏幕快照 2019-06-18 下午4.08.44.png
屏幕快照 2019-06-18 下午4.11.12.png
这段代码有什么问题?
屏幕快照 2019-06-18 下午4.13.54.png
————导致循环引用————
解决办法
屏幕快照 2019-06-18 下午4.26.30.png
使用swift实现一个函数,输入是任一整数,输出要返回输入的整数+2
这道题使用了swift的柯里化特性。
柯里化:是指从一个多参数函数变成一连串单参数函数的变换。
简化下面代码
屏幕快照 2019-06-18 下午5.04.06.png
两种方式简化:
屏幕快照 2019-06-18 下午5.15.29.png
这段代码打印出来会是什么?
打印结果:
屏幕快照 2019-06-18 下午5.19.49.png 屏幕快照 2019-06-18 下午5.20.33.png
打印结果:
屏幕快照 2019-06-18 下午5.21.04.png
网友评论