iOS之各种区别

作者: APP叫我取个帅气的昵称 | 来源:发表于2017-05-15 10:47 被阅读1558次

    写在前面:本文持续更新,也欢迎简友提供更多的关于iOS(包括swift)中的区别

    1. __ _block和 _ _ _weak修饰符的区别的:

    (1). _ _block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。 
    (2). _ _weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。 
    (3). _ _block对象可以在block中被重新赋值, _ _weak不可以。
    
    注: 变量对象在block中是只读的,前面用_ _block修饰是为了让block是复制其引用地址来实现对外界变量的访问。
    

    2.assign和weak有什么区别

      一 、区别
    
           (1).修饰变量类型的区别 weak只可以修饰对象。如果修饰基本数据类型,编译器会报错-“Property with ‘weak’ attribute must be of object type”。assign 可修饰对象,和基本数据类型。当需要修饰对象类型时,MRC时代使用unsafe_unretained。当然,unsafe_unretained也可能产生野指针,所以它名字是"unsafe_”。
           (2).是否产生野指针的区别 weak不会产生野指针问题。因为weak修饰的对象释放后(引用计数器值为0),指针会自动被置nil,之后再向该对象发消息也不会崩溃。 weak是安全的。assign 如果修饰对象,会产生野指针问题;如果修饰基本数据类型则是安全的。修饰的对象释放后,指针不会自动被置空,此时向对象发消息会崩溃。
      二、相似
              都可以修饰对象类型,但是assign修饰对象会存在问题
      三、总结
              assign 适用于基本数据类型如int,float,struct等值类型,不适用于引用类型。因为值类型会被放入栈中,遵循先进后出原则,由系统负责管理栈内存。而引用类型会被放入堆中,需要我们自己手动管理内存或通过ARC管理。weak 适用于delegate和block等引用类型,不会导致野指针问题,也不会循环引用,非常安全。当然怎么选择使用assign还是weak,MRC的话只能用assign,在ARC的情况下最好使用weak,因为weak修饰的变量在释放后自动指向nil,防止野指针存在。
    

    3. copy与retain(strong)的区别

    谢谢简友 追善的指出, 此条之前的说法的确不够严谨,吾正在详细创造中... 下面先放个图

    copy修饰的可变与不可变.png

    4.assign和retain的区别

    assign就是直接赋值,从而可能引起1中的问题,当数据为int, float等原生类型时,可以使用assign。retain就如2中所述,
    使用了引用计数,retain引起引用计数加1, release引起引用计数减1,当引用计数为0时,dealloc函数被调用,内存被回收。
    

    5. extension和category的区别

    extension看起来很像一个匿名的category,但是extension和有名字的category几乎完全是两个东西。 
    extension在编译期决议,它就是类的一部分,在编译期和头文件里的@interface以及实现文件里的@implement一起形成一个完整的类,它伴随类的产生而产生,亦随之一起消亡。extension一般用来隐藏类的私有信息,你必须有一个类的源码才能为一个类添加extension,所以你无法为系统的类比如NSString添加extension。
    但是category则完全不一样,它是在运行期决议的。就category和extension的区别来看,我们可以推导出一个明显的事实,extension可以添加实例变量,而category是无法添加实例变量的(因为在运行期,对象的内存布局已经确定,如果添加实例变量就会破坏类的内部布局,这对编译型语言来说是灾难性的)。
    

    6. const和宏(define)的区别

    1.define在预处理阶段进行替换,const常量在编译阶段使用
    2.define不做类型检查,仅仅进行替换,const常量有数据类型,会执行类型检查
    3.define不能调试,const常量可以调试
    4.define定义的常量在替换后运行过程中,会不断地占用内存,而const定义的常量存储在数据段,只有一份copy,效率更高。
    5.define可以定义一些简单的函数和方法,而const不能
    

    7. id 和 instancetype 的区别

    1.  instancetype 和 id 都是万能指针,指向对象。 
    2.  不同点: 
        id在编译的时候不能判断对象的真实类型,instancetype在编译的时候可以判断对象的真实类型 
        id可以用来定义变量,可以作为返回值类型,可以作为形参类型;instancetype只能作为返回值类型  
    3.  注意:以后凡是自定义构造方法,返回值类型尽量使用instancetype,不要使用id 
    

    8.struct和class的区别

    struct是值引用 深拷贝,不可继承,swift更加推荐使用struct。
    class是类引用 浅拷贝 可继承
    

    To be continued...

    相关文章

      网友评论

      • TianBai:你说金钱买不来时间? 网管,加两块钱。 你说金钱买不来知识? 老师,这是我的学费。 你说金钱买不来爱情? 丈母娘,这是我的礼金。 你说我上不了热评? 爹,右上角。
      • 秋雨无痕:有些错误
      • wnido:第8条也错了 ,struct 的内存是在 栈上面,生命周期不是由我们控制的 , 也不是值引用,深拷贝 。。。class 。。😓 这条太乱了。。不知道你咋综合在一起的 。。。他们俩的区别并不是表现在这方面的 ,至于swift 推荐使用 struct ,OC 也是可以的,以前不推荐主要是 内存瓶颈 ,现在内存随便飞。。struct 相较于 class 执行速率上是要更好的
        wnido:@APP叫我取个帅气的昵称 swift 没咋写, 不过可以看出 ,swift 中的 struct 和 C 或者 OC 中的 struct 是完全不一样的。 你这里标注这个区别只是在 swift 中 ,应该是没问题的
        APP叫我取个帅气的昵称:关于第8条详细地可以参考这篇文章 http://www.jianshu.com/p/8011b638b3a9 我只是简单抽了几个关键词
      • wnido:第3条全错了 ,retain 不是指拷贝 ,copy 也不仅仅是内容拷贝,也可以指针拷贝
        http://www.jianshu.com/p/9b05f9268494 :smile: 可以看看我写的
        APP叫我取个帅气的昵称:关于第三条 retain是引用计数器加1; 而copy在可变和不可变的时候的确可以存在指针拷贝和内容拷贝 ,正打算详细地写一篇...:smiley:
      • 额本司:赞,就是移动端阅读体验不太好

      本文标题:iOS之各种区别

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