IOS总结(六)

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管理,需要开发者手动释放

7.什么情况使用weak关键字,相比assign有什么不同?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容