OC面试题踩坑

1. __block和__weak修饰符的区别

  1. __block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。
  2. __weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。
  3. __block对象可以在block中被重新赋值,__weak不可以。

2. 相关父类

  1. UIButton 的父类是UIControl
  2. UIControl的父类是UIView
  3. UIView的父类是 UIResponder

3. OC修饰符:

可读可写修饰符

  1. readWrite: 可读可写修饰符,系统为我们创建属性的getter和setter方法
  2. readOnly: 只读修饰符,系统只为我们创建属性的getter方法
  3. writeOnly:不可读可写修饰符,系统只为属性生成setter方法

- 原子修饰符

  1. atomic: 原子修饰符,表示线程安全(系统默认生成atomic)
  2. nonatomic:非原子修饰符,使用此修饰符性能会提升

- setter修饰符(assign,copy,retain)

  1. assign修饰符: 修饰OC基本数据类型(NSInterger和CGFloat)和C基本数据类型(int,float,double)并且还有id类型,不涉及内存管理,如果该修饰符修饰对象类型,就会出现内存泄露的问题.
  2. retain修饰符: 修饰对象类型,当修饰基本数据类型的时候就会报错,当设置某属性setter方法时,先将该对象的属性进行release操作,然后对属性进行赋值,并执行retain操作
  3. 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. 浅复制和深复制的区别

  1. 浅层复制:只复制指向对象的指针,而不复制引用对象本身。
  2. 深层复制:复制引用对象本身。

意思就是说我有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象本身资源.还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一个思想。深复制就好理解了,内存中存在了两份独立对象本身。
用网上一哥们通俗的话将就是:
浅复制好比你和你的影子,你完蛋,你的影子也完蛋
深复制好比你和你的克隆人,你完蛋,你的克隆人还活着。

你可能感兴趣的:(OC面试题踩坑)