iOS之各种区别

来源:互联网 发布:md5加密c语言代码 编辑:程序博客网 时间:2024/06/05 15:51
144 
作者 APP叫我取个帅气的昵称 关注
2017.05.15 10:47* 字数 140 阅读 1273评论 7

写在前面:本文持续更新,也欢迎简友提供更多的关于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更加推荐使用structclass是类引用 浅拷贝 可继承

To be continued...


原创粉丝点击