iOS最新面试题汇总(二)

作者: 寻常_0 | 来源:发表于2017-06-07 16:49 被阅读8551次

    iOS最新面试题汇总:
    iOS最新面试题汇总(一)
    iOS最新面试题汇总(二)
    iOS最新面试题汇总(三)
    iOS最新面试题汇总(四)

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

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

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

    区别:

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

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

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

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

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

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

    1. 什么是 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)options context:(nullable void *)context;
      // 当被观察的属性发送变化时,会自动触发下方方法

    2. (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{}
      KVC 和 KVO 的 keyPath 可以是属性、实例变量、成员变量。

    3. KVC的底层实现?

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

    1. KVO的底层实现?

    KVO基于runtime机制实现。

    1. 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上消失。

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

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

    1. 你是否接触过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:));

    1. 调用方法有两种方式:

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

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

    答: Profile-> Instruments ->Time Profiler

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

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

    1. 什么是懒加载?

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

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

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

    1. 什么是谓词?

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

    1. isa指针问题

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

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

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

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

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

    联系

    github地址:https://github.com/meetly
    希望大家多多指教!

    相关文章

      网友评论

      • Metros:5: delete => delegate
      • 默默_David:第9题里面,awakeFromNib是UIView的方法,应该是initWithNib吧;第10题里面,方法是Method,是对于方法函数指针与方法描述,而方法选择器是SEL类型数据,它仅仅是一个方法编码performSelector(sel)才是函数的指针
        寻常_0:第9题 :xib 加载走的是awakeFromNib ,非storyBoard(xib或非xib)走initWithNibName
      • 图长伴:week 是 weak 注意错别字。
        寻常_0:多谢提醒,已改:pray: :pray: :pray:
      • 梁森的简书:iOS 里还有@package? Java里的吧
        寻常_0:有的,不过不经常使用,The @package scope for Objective-C instance variables is analogous toprivate_extern for C variables and functions. Any code outside the class implementation’s image that tries to use the instance variable gets a link error.
        Objective-C中的@package与C语言中变量和函数的private_extern类似。任何在实现类的镜像之外的代码想使用这个实例变量都会引发link error

      本文标题:iOS最新面试题汇总(二)

      本文链接:https://www.haomeiwen.com/subject/jacafxtx.html