2017 iOS最新面试题汇总(一)

来源:互联网 发布:电脑桌面滚动字幕软件 编辑:程序博客网 时间:2024/06/03 21:23

原文地址   点击打开链接


  1. Objective-C 中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码、方法又是什么?

    答:线程创建有三种方法:使用NSThread创建、使用GCD的dispatch、使用子类化的NSOperation,然后将其加入NSOperationQueue;在主线程执行代码,方法是performSelectorOnMainThread,如果想延时执行代码可以用performSelector:onThread:withObject:waitUntilDone:

  2. Category(类别)、 Extension(扩展)和继承的区别

    区别:

    1. 分类有名字,类扩展没有分类名字,是一种特殊的分类。
    2. 分类只能扩展方法(属性仅仅是声明,并没真正实现),类扩展可以扩展属性、成员变量和方法。
    3. 继承可以增加,修改或者删除方法,并且可以增加属性。
  3. 我们说的OC是动态运行时语言是什么意思?

    答:主要是将数据类型的确定由编译时,推迟到了运行时。简单来说, 运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。

  4. 为什么我们常见的delegate属性都用是week而不是retain/strong?

    答:是为了防止delegate两端产生不必要的循环引用。
    @property (nonatomic, weak) id<UITableViewDelegate> delegate;

  5. 什么时候用delete,什么时候用Notification?

    Delegate(委托模式):1对1的反向消息通知功能。
    Notification(通知模式):只想要把消息发送出去,告知某些状态的变化。但是并不关心谁想要知道这个。

  6. 什么是 KVO 和 KVC?

    1). KVC(Key-Value-Coding):键值编码 是一种通过字符串间接访问对象的方式(即给属性赋值)

    举例说明:stu.name = @"张三" // 点语法给属性赋值[stu setValue:@"张三" forKey:@"name"]; // 通过字符串使用KVC方式给属性赋值stu1.nameLabel.text = @"张三";[stu1 setValue:@"张三" forKey:@"nameLabel.text"]; // 跨层赋值

    2). KVO(key-Value-Observing):键值观察机制 他提供了观察某一属性变化的方法,极大的简化了代码。
    KVO只能被KVC触发,包括使用setValue:forKey:方法和点语法。
    // 通过下方方法为属性添加KVO观察

    1. -(void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)optionscontext:(nullable void *)context;
      // 当被观察的属性发送变化时,会自动触发下方方法 
    2. (void)observeValueForKeyPath:(NSString *)keyPathofObject:(id)object change:(NSDictionary *)changecontext:(void *)context{}
      KVC 和 KVO 的 keyPath 可以是属性、实例变量、成员变量。
  7. KVC的底层实现?

    当一个对象调用setValue方法时,方法内部会做以下操作:
    1). 检查是否存在相应的key的set方法,如果存在,就调用set方法。
    2). 如果set方法不存在,就会查找与key相同名称并且带下划线的成员变量,如果有,则直接给成员变量属性赋值。
    3). 如果没有找到_key,就会查找相同名称的属性key,如果有就直接赋值。
    4). 如果还没有找到,则调用valueForUndefinedKey:和setValue:forUndefinedKey:方法。
    这些方法的默认实现都是抛出异常,我们可以根据需要重写它们。

  8. KVO的底层实现?

    KVO基于runtime机制实现。

  9. ViewController生命周期

    按照执行顺序排列:
    1.initWithCoder:通过nib文件初始化时触发。
    2.awakeFromNib:nib文件被加载的时候,会发生一个awakeFromNib的消息到nib文件中的每个对象。
    3.loadView:开始加载视图控制器自带的view。
    4.viewDidLoad:视图控制器的view被加载完成。
    5.viewWillAppear:视图控制器的view将要显示在window上。
    6.updateViewConstraints:视图控制器的view开始更新AutoLayout约束。
    7.viewWillLayoutSubviews:视图控制器的view将要更新内容视图的位置。
    8.viewDidLayoutSubviews:视图控制器的view已经更新视图的位置。
    9.viewDidAppear:视图控制器的view已经展示到window上。
    10.viewWillDisappear:视图控制器的view将要从window上消失。
    11.viewDidDisappear:视图控制器的view已经从window上消失。

  10. 方法和选择器有何不同?

    selector是一个方法的名字,方法是一个组合体,包含了名字和实现。

  11. 你是否接触过OC中的反射机制?简单聊一下概念和使用

    1). class反射
    通过类名的字符串形式实例化对象。

    Class class = NSClassFromString(@"student"); Student *stu = [[class alloc] init];

    将类名变为字符串。

    Class class =[Student class];NSString *className = NSStringFromClass(class);

    2). SEL的反射
    通过方法的字符串形式实例化方法。

    SEL selector = NSSelectorFromString(@"setName");  [stu performSelector:selector withObject:@"Mike"];

    将方法变成字符串。

    NSStringFromSelector(@selector*(setName:));
  12. 调用方法有两种方式:

    1). 直接通过方法名来调用。[person show];
    2). 间接的通过SEL数据来调用 SEL aaa = @selector(show); [person performSelector:aaa]; 

  13. 如何对iOS设备进行性能测试?

    答: Profile-> Instruments ->Time Profiler

  14. 开发项目时你是怎么检查内存泄露?

    1). 静态分析 analyze。
    2). instruments工具里面有个leak可以动态分析。

  15. 什么是懒加载?

    答:懒加载就是只在用到的时候才去初始化。也可以理解成延时加载。
    我觉得最好也最简单的一个例子就是tableView中图片的加载显示了, 一个延时加载, 避免内存过高,一个异步加载,避免线程堵塞提高用户体验。

  16. 类变量的 @public,@protected,@private,@package 声明各有什么含义?

    @public 任何地方都能访问;
    @protected 该类和子类中访问,是默认的;
    @private 只能在本类中访问;
    @package 本包内使用,跨包不可以。

  17. 什么是谓词?

    谓词就是通过NSPredicate给定的逻辑条件作为约束条件,完成对数据的筛选。
    //定义谓词对象,谓词对象中包含了过滤条件(过滤条件比较多)
    NSPredicate predicate = [NSPredicate predicateWithFormat:@"age<%d",30];
    //使用谓词条件过滤数组中的元素,过滤之后返回查询的结果
    NSArray 
    array = [persons filteredArrayUsingPredicate:predicate];

  18. isa指针问题

    isa:是一个Class 类型的指针. 每个实例对象有个isa的指针,他指向对象的类,而Class里也有个isa的指针, 指向meteClass(元类)。元类保存了类方法的列表。当类方法被调 用时,先会从本身查找类方法的实现,如果没有,元类会向他父类查找该方法。同时注意的是:元类(meteClass)也是类,它也是对象。元类也有isa指针,它的isa指针最终指向的是一个根元类(root meteClass)。根元类的isa指针指向本身,这样形成了一个封闭的内循环。

  19. 如何访问并修改一个类的私有属性?

    1). 一种是通过KVC获取。
    2). 通过runtime访问并修改私有属性。

  20. 一个objc对象的isa的指针指向什么?有什么作用?

    答:指向他的类对象,从而可以找到对象上的方法。



原创粉丝点击