程序篇
1、AppDelegate 周期方法
didFinishLaunchingWithOptions -- 应用程序启动
applicationWillResignActive -- 应用程序失活(活动状态切换到非活动状态)
applicationDidEnterBackground -- 应用程序进入后台
applicationWillEnterForeground -- 应用程序即将进入前台
applicationDidBecomeActive -- 应用程序已被激活
applicationWillTerminate -- 应用程序即将退出
2、UIViewController 周期方法(按顺序)
1、alloc -- 创建对象,分配空间
2、init -- 初始化对象,初始化数据
3、loadView -- 从nib载入视图
4、viewDidLoad -- 视图加载完成
5、viewWillAppear -- 视图即将出现
6、viewDidAppear -- 视图已经出现
7、viewWillDisappear -- 视图即将消失
8、viewDidDisappear -- 视图已经消失
9、dealloc -- 视图销魂,内存释放
3、属性关键字的使用
assign: 用于基本的数据类型。
weak:弱引用,在对象释放时,属性值会自动清空,一般用于UI控件。
strong:强引用,一般用于对象类型(NSArray、NSDate、NSNumber、模型类), 一个对象只要有强指针引用着,就不会被销毁。
copy:用于希望获得源对象的副本而不改变源对象的内容。
retain:用于获得源对象的所有权时。
readwrite:可读可写,但需要手动去写setter与getter的方法。
readonly:只读,只生成getter方法。
nonatomic:非原子操作,不提供多线程保护,不安全,但是效率高。
automic:保证程序在多线程情况,编译器会自动生成一些互斥加锁代码,避免该变量的读写不同步问题。
4、代理为什么要用weak,block和代理的区别?
用weak是为了避免循环引用
block和代理都可以进行传值、不同的是 代理(协议)必须先声明实现的方法,委托人要遵守它的协议方法!要注意避免循环引用!
5、copy与mutablecopy(浅复制和深复制)
浅复制:只复制对象的指针,而不复制引用对象本身。
深复制:复制引用对象本身。
浅复制只是复制了对象的指针,而对象资源只有一份,而深复制在内存中存在了两个独立的对象本身。
6、修饰的属性 @dynamic、@systhesize
@dynamic --- getter与setter方法不会帮你自动生成,需自己手动实现!
@systhesize --- getter与setter方法自动生成,可以指定与属性相对应的成员变量!
7、写出属性的setter与getter方法
- (void)setName:(NSString *)name{
_name = name;
}
- (NSString *)name{
return _name;
}
8、类目、延展、协议
类目category:为现有的类增加新方法
延展interface: 给一个类,声明私有的方法和变量
协议protocol:声明一些方法,让别的类来实现,协议不是类,它是定义一个其他对象可以实现的接口。
9、tableView的重用机制
UITableView通过重用单元格的方式来达到节省内存的目的。通过为每个单元格指定一个重用标识符(reuseIdentifier),指定了单元格的种类。假如一个TableView有10个单元格,但是屏幕上最多只能显示4个,实际上系统只为其分配了4个单元格的内存,当滚动单元格时,屏幕内显示的单元格会重复使用这四个内存。简单理解就是单元格滑出屏幕时,就会将其放到一个重用池(数组)中,当要显示某一行单元格时,再将其取出来,如果没有,就直接创建。
内存篇
1、索引计数
创建一个对象后,索引计数就表示有多少个变量在用这个对象,当索引计数为0时,就表示这个对象没人用了,就可以清除了,但有人用了,做了标记,却在不用时没有取消自己的索引计数,那么这块资源就永远被标记有人在用,无法释放,就会造成内存泄漏。
2、对内存管理的理解
1、ARC(自动计数):在代码中自动加入retain / release,原先需要手动添加的用来处理内存管理的引用计数的代码,可以自动的由编译器来执行。 2、MRC (手动计数):当使用new、alloc、或者是copy创建一个对象是,该对象引用计数器为1,如果不需要使用该对象时,可以向其发送release或autorelease消息,在使用完毕后进行销毁。如果retain某个对象,需要release或autorelease该对象,保持retain和release方法的使用次数相等。使用便利构造方法的对象无需手动管理内存。 3、autorelease(自动释放池):自动释放池是oc提供的一种自动回收的机制,具有延迟释放的特性,即当我们创建了一个对象,并把他加入到了自动释放池中时,他不会立即被释放,会等到一次runloop结束或者作用域超出{}或者超出[pool release]之后再被释放。
4、内存管理的几条原则
1、OC的内存管理机制中比较重要的一条规律是:谁申请,谁释放。 2、要避免过早释放和内存泄漏。 3、如果retain了某个对象,需要release或autorelease该对象,要保持retain方法和release方法使用次数相等。 4、通过方法获取对象,则可以假设这个对象引用计数加1,需要在使用完后进行release。 5、使用new,alloc,copy关键字生成的对象或retain了的对象需要手动释放。 6、设置正确的property属性,对于retain要在合适的地方释放。
7、ARC项目中引用MRC文件和MRC中引用ARC文件
在工程文件bulid phases 中标识 ARC 项目 -fno-objc-arc、 MRC项目 -fobjc-arc
runtime
1、概念
(1)、OC是基于C的,它为C添加了面向对象的特性,他将很多静态的语言在编译和链接时期做的事放到了runtime运行时来处理。 (2)、runtime(运行时),是一套纯C的API,而OC就是运行时机制,也就是运行时候的一些机制,其中最主要的就是 消息机制。 (3)、OC函数的调用成为消息发送,属于 动态调用过程,在编译的时候并不能决定调用哪个函数,只有在运行的时候才会根据函数的名称找到对应的函数调用。
2、消息机制
(1)、OC的代码在运行的时候也是转换成了runtime方式运行的,任何方法调用的本质就是 发送一个消息(用runtime发送消息)。 (2)、消息机制原理:对象根据方法编号SEL去映射表查找对应的实现方法。每一个OC的方法,底层必然有一个对应的runtime方法。 (3)、注解:在xcode中 build setting 搜索msg -> objc_msgSend (YES -> NO)
3、方法调用流程
对象方法 -- 保存到类对象的方法列表。 类方法 -- 保存到元类(Meta Class)中方法列表。 (1)、OC向一个对象发送消息时,runtime会根据对象的isa指针找到该对象对应的类或者是父类中查找方法。 (2)、注册方法编号,根据编号去查找对应的方法。 (3)、找到的只是最终函数实现的地址,然后根据地址去方法区调用对应的函数。 补充: 每一个对象内部都有一个isa指针,这个指针是指向它的真实类型,根据这个类型就能知道将来调用哪个方法。
4、runtime 开发场景
(1)、runtime 交换方法,当三方框架或系统原生的方法不能满足的时候,可以在保持系统原有方法的基础上,添加额外的功能。 (2)、runtime 给分类动态添加属性,给系统的类添加属性的时候,可以使用runtime动态添加属性方法。 (3)、runtime 字典转模型,原理:遍历模型中所有的属性,根据属性名,去字典中查找key,取出对应的值,给模型的属性赋值。 注(三种情况): 字典的key 和模型的值不匹配 模型中嵌套着模型(字典中还有字典) 数组中有模型