IOS总结(六)

作者: 梦醒繁华 | 来源:发表于2016-09-17 17:37 被阅读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管理,需要开发者手动释放

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

    相关文章

      网友评论

        本文标题:IOS总结(六)

        本文链接:https://www.haomeiwen.com/subject/vthwettx.html