# iOS下常用类库整理
网络处理 AFNetWorking Alamofire
数据库 fmdb sqlite.swift
图片异步加载 sdwebimage kingfisher
分享 ShareSDK
菊花君 MBProgressHUD
轮播 SDCycleScrollView 自己封装吧
json解析 MJEXension SwiftJson
视频 IJKMediaplayer
推送 极光
总结学习学习Effective Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法
1. 消息与函数调用 区别
oc 中消息型语言与函数调用 oc其运行的代码由运行环境决定 函数调用 由编译器决定
举例说明多态情况下: oc 运行时不管是否多态在运行时去查找这个方法
函数 是多态的话会运行时按照虚方法表来查到底要执行的方法
明白oc中所有的对象分配是在堆上的,不是在栈上的,延用c 语言的方式
NSString astackstring 错误 而只能这样使用NSString *str; 去手动分配
2.内存上面的问题
分配在堆上的对象等需要手动管理 栈上的会在弹出时自动清理 如基本类型的变量 包括一系列CG开头的
oc中将内存管理抽象出来,不需要用malloc 和 free 分配释放 而去使用引用计数的方式来管理
3.头文件中尽量少引用其他头文件,说不定就会造成头文件引用
@class 来标明其它类属性 优雅解决
使用协议呢 将其放在单独的文件更好
4.多用类型常量少用预处理
a.h中预定义 了个 #define Max 8 那么有b.h 引入这个a.h会把 所有Max 都会换成这个的 且预处理的不含类型信息(缺点)
使用 static const double max = 8 这种方式会更合适点
使用const标记的 , 想要对它修改 编译就会让它报错
如果不加static ,编译器会为其创建一个外部符号 如果另一个类中也声明了这样的常量 max 编译器会给出错误提示
用static这个可以来标记这种变量命名一样是否可以在多个类中使用
加了 就不会给他创建一个外部符号,来表示 这个常量就是在本类使用的
static const 修饰的只会在编译单元内 私有这样来说比较通俗(什么时编译单元内呢, 实际就是.m文件的东西都属于编译单元)
定义这些常量的位置讲究, 是否公开这个常量 不公开 放在实现文件 这样做会更好
命名规范加类名前缀来避免空间 上的重名冲突
如通知的典范,通知名字字符的定义 .h 中 extern NSString *const eocstring; .m NSString *const eocstring = @“窗口变化饿了”
怎么看常量定义: 从右向左解读 eocstring 常量 什么样的常量 是一个指针, 这个指针指向nsstring
extern 关键标识的常量 会放在 全局符号表中 只能定义一次,在实现文件定义好了过后 编译器会在数据段为这个字符串分配存储空间
这种方式会让编译器来确保常量值不变 ,且不管在哪个类中定义的这个 所有地方都可以用
5.用枚举的时机 : 状态、选项、状态码
enum ECname:NSInteger{
ECsucceed = 1,
ECerror,
};
//某种状态可以组合 的方式比如在使用到 animation 选项的时候多种状态组合实现
enum ECtype:NSInteger{
ECnone = 0 ,
ECsucceed = 1<<0, //00000001
ECperfect= 1<<1, //00000010 00000011 3
};
typedef enum ECtype ectype;
ectype atype = ECsucceed | ECperfect ;
//这种不能判断用与ecnone为0这种 与符号为0嘛
if ((atype & ECsucceed ) && (atype & ECperfect) ){
NSLog(@"开启完美 成功模式");
}
6.关于runtime机制的理解
先说原理不好理解,因此先说说它能干什么
1. 如果是在程序运行过程中 , 希望动态创建一个类(比如kvo底层就是基于这个特性)
2.程序运行过程中希望动态的生成一些属性或者方法 包括修改
3.遍历一个类的所有成员变量和方法 ,如一个类的属性方法特别多的时候
//这个东西 可以用语深层次开发框架
如:在归档的时候
-(void)encodeWithCoder:(NSCoder )encoder {
unsigned int count = 0;
Ivar ivars = class_copyIvarList([PYPerson class], &count);
for (int i = 0; i