iOS面试集锦

269 阅读4分钟

一、 OC基础

1. @property 的本质是什么?ivar、getter、setter 是如何生成并添加到这个类中的

  1. 简单解释:
  • @property 的本质是什么? @property = ivar + getter + setter;
  • ivargettersetter 是如何生成并添加到这个类中的? “自动合成”( autosynthesis);
  1. 详细解释

2. @protocol 和 category 中如何使用 @property

  1. 简单解释
    • protocol :我们只需遵循协议,并实现属性就行
    • category:只生成了settergetter 方法没有生成ivar 变量,可以通过关联对象进行实现
  2. 详细解释
    1. 在 protocol 中使用 property 只会生成 setter 和 getter 方法声明,我们使用属性的目的,是希望:“遵守协议的对象”能实现该属性,
    2. category 使用 @property 也是只会生成 setter 和 getter 方法的声明,如果我们真的需要给 category 增加属性的实现,需要借助于运行时的两个函数: objc_setAssociatedObject 设置关联属性 objc_getAssociatedObject 获取关联属性

3. @synthesize和@dynamic分别有什么作用?

  1. 简单解释:

    @synthesize使编译时: 自动生成setter, getter方法以及 var 变量; @dynamic 使编译时:不生成setter,getter方法以及var 变量;

    • 如果 @synthesize@dynamic都没写,那么默认的就是@syntheszie var = _var;
    • 这两个关键字只能在实现文件里使用
  2. 详细解释

4. ARC下,不显式指定任何属性关键字时,默认的关键字都有哪些?

  1. 简单解释
    1. 对应基本数据类型默认关键字是 atomic、readwrite、assign
    2. 对于普通的 Objective-C 对象 atomic、readwrite、strong
  2. 参考链接

5. runtime 如何实现 weak 属性?

  1. 简单解释

  2. 详细解释


6. weak属性需要在dealloc中置nil么?

  1. 简单解释
    • 不需要

    在ARC环境无论是强指针还是弱指针都无需在 dealloc 设置为 nil , ARC 会自动帮我们处理

  2. 详细解释 即便是编译器不帮我们做这些,weak也不需要在 dealloc 中置nil: 正如上文的:runtime 如何实现 weak 属性? 中提到的: 我们模拟下 weak 的 setter 方法,应该如下:
- (void)setObject:(NSObject *)object
{
 objc_setAssociatedObject(self, "object", object, OBJC_ASSOCIATION_ASSIGN);
 [object cyl_runAtDealloc:^{
     _object = nil;
 }];
}

如果对 cyl_runAtDealloc 的实现原理有兴趣,可以看下我写的一个小库,可以使用 CocoaPods 在项目中使用: CYLDeallocBlockExecutor 也即:

在属性所指的对象遭到摧毁时,属性值也会清空(nil out)。


7. @property中有哪些属性关键字?/ @property 后面可以有哪些修饰符?

  1. ** 简单解释** 属性可以拥有的特质分为四类:
    1. 原子性--- nonatomic 特质
    2. 读/写权限---readwrite(读写)、readonly (只读)
    3. 内存管理语义---assign、strong、 weak、unsafe_unretained、copy
    4. 方法名---getter= 、setter=

    不常用的:nonnull,null_resettable,nullable

  2. 详细解释

8. 使用runtime Associate方法关联的对象,需要在主对象dealloc的时候释放么?

  1. 简单解释
    • 在ARC下不需要。
    • 在MRC中,对于使用retain或copy策略的需要 。 在MRC下也不需要

    无论在MRC下还是ARC下均不需要。

  2. 详细解释

9. 用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?

  1. 简单解释

    1. 因为父类指针可以指向子类对象,使用 copy 的目的是为了让本对象的属性不受外界影响,使用 copy 无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本.
    2. 如果我们使用是 strong ,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性.
  2. 详细解释

10. block有哪几种类型?怎么避免循环引用?

  1. 简单解释
    • 根据在内存中的不同分为

      1. 数据区: __NSGlobalBlock__
      2. 栈区:__NSStackBlock__
      3. 堆区:__NSMallocBlock__
    • 避免循环引用:

      1. __weak 修饰
      2. block 传值
  2. 详细解释

11. 什么时候会报unrecognized selector的异常?

  1. 简单解释

    • 当没有找到这个方法的实现的时候就会报这个异常
    • 因为OC是动态语言:在报这个异常之前,会进行消息转发,因而会有三次拯救程序崩溃的机会
  2. 详细解释

    • runtime这篇文章里会有unrecognized selector重现的步骤

12. iOS 为什么给nil发送消息不会崩溃?

  1. 简单解释

    • Objective-C中的函数调用都是通过objc_msgSend进行消息发送来实现的,而objc_msgSend会通过判断参数self来决定是否发送消息,如果传递给objc_msgSend的参数self为 nil,那么selector会被置空,该函数不会执行而是直接返回。
  2. 详细解释

二、Swift相关


持续更新中.....