1. __block和__weak修饰符的区别
- __block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。
- __weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。
- __block对象可以在block中被重新赋值,__weak不可以。
2. 相关父类
- UIButton 的父类是UIControl
- UIControl的父类是UIView
- UIView的父类是 UIResponder
3. OC修饰符:
可读可写修饰符
- readWrite: 可读可写修饰符,系统为我们创建属性的getter和setter方法
- readOnly: 只读修饰符,系统只为我们创建属性的getter方法
- writeOnly:不可读可写修饰符,系统只为属性生成setter方法
- 原子修饰符
- atomic: 原子修饰符,表示线程安全(系统默认生成atomic)
- nonatomic:非原子修饰符,使用此修饰符性能会提升
- setter修饰符(assign,copy,retain)
- assign修饰符: 修饰OC基本数据类型(NSInterger和CGFloat)和C基本数据类型(int,float,double)并且还有id类型,不涉及内存管理,如果该修饰符修饰对象类型,就会出现内存泄露的问题.
- retain修饰符: 修饰对象类型,当修饰基本数据类型的时候就会报错,当设置某属性setter方法时,先将该对象的属性进行release操作,然后对属性进行赋值,并执行retain操作
- copy修饰符: 修饰基本数据类型(NSString,NSArray和NSMutableArray), 表示复制内容
(retain指针的复制,copy内容的复制, strong类似于retain,weak类似于assign)
- getter和setter修饰符
@property (getter = getMethodName, setter = setMethodName) Object *obj;
用于设置自定义生成的getter和setter方法名,使用之后就可以系统不会再生成getter和setter方法
小技巧:
使用assign:对基础数据类型(如NSInteger, CGFloat)和C数据类型(int, float, double, char等), 另外还有id类型
使用copy:对NSString类型
使用retain:对其它NSObject和其子类
4. 浅复制和深复制的区别
- 浅层复制:只复制指向对象的指针,而不复制引用对象本身。
- 深层复制:复制引用对象本身。
意思就是说我有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象本身资源.还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一个思想。深复制就好理解了,内存中存在了两份独立对象本身。
用网上一哥们通俗的话将就是:
浅复制好比你和你的影子,你完蛋,你的影子也完蛋
深复制好比你和你的克隆人,你完蛋,你的克隆人还活着。