写在前面:本文持续更新,也欢迎简友提供更多的关于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)的区别
谢谢简友 追善的指出, 此条之前的说法的确不够严谨,吾正在详细创造中... 下面先放个图
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...