A------> 内存管理的基本原则
1、你拥有你所创建的对象的所有权 ( alloc new copy mutable copy 开头的方法都是在创建对象 )
2、获取一个对象的所有权 ,可以发送 -retain 消息
3、当不需要拥有一个对象时,需要释放该对象的所有权, 发送 -release消息,代表立即释放所有权;发送 autorelease 消息, 代表延迟释放
4、不能释放不属于自己的对象 ( 过度释放 )
5、必须保证对象的引用计数增减平衡,谁申请谁释放 ( 即在一定的代码段中,对同一个对象所做的 copy retain alloc new mutablecopy 操作, 应该与 release autorelease 操作的次数相同 )
6、在 MRC 下,用 copy ,retain 修饰的属性, 必须在该类实现中 , 重写 delloc 方法, 在【 super delloc 】之前,释放实例变量对传入对象的所有权, 不然会造成内存泄漏
7、对于便利构造器来说, 其对应的初始化方法,需要对传入的对象类型 参数 做持有( retain) 操作, 因此在返回时, 需要用 autorelease 延迟释放所有权, 这样既能保证增减平衡,又能有效返回对象。用便利构造器生成的对象已经在便利构造器内部实现了增减平衡,不需要额外释放
8、对于集合类,将对象添加进集合时,会对对象进行一次持有操作 ( 对象的引用计数自动 + 1 ),表示集合持有该对象;将对象从集合中删除时有两种情况 : 1)对象直接从集合中删除, 这时会自动给对象释放所有权( 对象引用计数 - 1 )表示集合不再拥有对象的所有权。 2)集合自身被销毁时 ,会自动给集合中存在的所有元素发送一次 release 消息
B ------- > self 和 super 是什么意思, 有什么区别
1 ---- > 1)、super 是一条编译器指令,出现在方法实现内部, 大部分情况下用在重写父类方法,希望扩充父类方法功能的场景下。2)、执行顺序是直接在当前类的直接父类中查找要调用的方法,然后逐级查找,遇到即返回
2 ----- > 2)、1)self 出现在方法实现内部,表示当前调用该方法的对象或类本身 2 )在方法内部实现采用self 调用其它方法时, 会现在本类中查找, 如果没有再向上查找, 找到即执行,然后返回。 这种状况下 self 是只读状态不能被修改 。 3)、当self 出现在自定义初始化方法内部时,可以被修改, self = [ super init ];
C ------- > 面向对象编程 和 面向过程有什么不同
面向过程,以事件为中心,详细考虑完成事件的步骤,不去考虑完成事件的参与者
面向对象, 是以完成事件的参与者为中心。 事件的参与者完成自己各自的特有功能 协作完成事件
D -------- > copy 和 retain 有什么区别
给对象发送 retain 消息, 表示为该对象增加了一个所有者, 该对象的引用计数 + 1
给对象发送 copy 消息( 浅拷贝,深拷贝 ) 表示该对象创建了一个副本, 原对象引用计数不变, 新创建的对象引用计数 + 1
当遵循NSCopying 协议的自定义类, 重写 copyWithZone 方法实现是一个伪拷贝功能时, 此时retain 和 copy 具有相同的功能
E ------------ > 协议和类声明 的区别是什么
协议只有一个 .h 文件,当中陈列了一堆方法名,只有遵循了该协议的类,才需要实现协议中的 @required 方法, @optional 方法可选实现 。
一个类包含了 接口文件和实现文件, 在接口文件中声明的方法, 必须在实现文件中实现