IOS总结(六)
2016-09-17 本文已影响69人
梦醒繁华
1.category和extension的区别
- category:分类有名字,类扩展没有分类名字,是一种特殊的分类
- extension:分类只能扩展方法(属性仅仅是声明,并没真正实现),类扩展可扩展属性、成员变量和方法。
2.define和const常量有什么区别?
- define在预处理阶段进行替换,const常量在编译阶段使用
- 宏不做类型检查,仅仅进行替换,const常量有数据类型,会执行类型检查
- define不能调试,const常量可以调试
- define定义的常量在替换后进行过程中会不断用内存,而const定义的常量存储在数据段只有一份copy,效率更高
- define可以定义一些简单的函数,const不可以
3.block和weak修饰符的区别?
- __block不管是ARC还是MRC模式下都可以使用,可以修饰对象,也可以修饰基本数据类型
- __weak只能在ARC模式下使用,只能修饰对象(NSString),不能修饰基本数据类型
- block修饰的对象可以在block中被重新赋值,weak修饰的对象不可以
4.static关键字的左右
- 函数(方法)体内static变量的作用范围为该函数体,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值
- 在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数调用;
- 在模块内的static函数只可被这一模块内的其它函数,这个函数的使用范围被限制在声明它的模块内;
- 在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
- 在类中的static成员函数所拥有,这个函数不接受this指针,因而只能访问类的static成员变量
5.堆和栈的区别
- 从管理方式来讲
- 对于栈来讲,是由编译器自动管理,无需我们手工控制;
- 对于堆来说,释放工作由程序员控制,容易产生内存泄漏(memory leak)
- 从申请大小方面讲
- 栈空间比较小
- 堆空间比较大
- 从数据存储方面来讲
- 栈空间中一般存储基本类型,对象的地址
- 堆空间一般存放对象本身,block的copy等
6.ARC下还会存在内存泄漏吗?
- 循环引用会导致内存泄漏
- Objective-C对象和CoreFoundation对象进行桥接的时候如果管理不当也会导致内存泄漏
- CoreFoundation中的对象不受ARC管理,需要开发者手动释放