美文网首页
iOS知识点-P3

iOS知识点-P3

作者: nande_糊涂 | 来源:发表于2022-07-13 10:41 被阅读0次

    卜算子·黄州定慧院寓居作 苏轼
    缺月挂疏桐,漏断人初静。时见幽人独往来,缥缈孤鸿影。
    惊起却回头,有恨无人省。拣尽寒枝不肯栖,寂寞沙洲冷。

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

    1. 分类有名字,类扩展没有分类名字,是一种特殊的分类。
    2. 分类只能扩展方法(属性仅仅是声明,并没真正实现),类扩展可以扩展属性、成员变量和方法。
    3. 继承可以增加,修改或者删除方法,并且可以增加属性。
    

    2、OC是动态运行时语言是什么意思?

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

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

    答:是为了防止delegate两端产生不必要的循环引用。
    1.如果用retain/strong修饰,会对监听代理的对象造成强引用,从而对该对象的生命周期产生影响。
    举例说明:一个Controller上有一个TableView,Controller强引用了TableView,TableView设置delegate为Controller,如果delegate为强引用,TableView又强引用了Controller,造成循环引用。
    2.为什么不用assign,weak和assign是一种“非拥有关系”的指针,通过这两种修饰符修饰的指针变量,都不会改变被引用对象的引用计数。但是在一个对象被释放后,weak会自动将指针指向nil,而assign则不会。在iOS中,向nil发送消息时不会导致崩溃的,所以assign就会导致野指针的错误unrecognized selector sent to instance。
    so,还是 
    @property (nonatomic, weak) id<UITableViewDelegate> delegate;
    

    4、什么时候用delete?什么时候用Notification?

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

    5、什么是 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观察
       - (void)addObserver:(NSObject *)observer
                         forKeyPath:(NSString *)keyPath
                         options:(NSKeyValueObservingOptions)options
                         context:(nullable void *)context;
       // 当被观察的属性发送变化时,会自动触发下方方法                   
       - (void)observeValueForKeyPath:(NSString *)keyPath
                                  ofObject:(id)object
                                      change:(NSDictionary *)change
                                     context:(void *)context{}
        
    KVC 和 KVO 的 keyPath 可以是属性、实例变量、成员变量。
    

    6、KVC的底层实现?

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

    7、KVO的底层实现?

    KVO基于runtime机制实现。
    

    8、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上消失。
    

    9、方法和选择器有何不同?

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

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

    11、调用方法有两种方式:

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

    相关文章

      网友评论

          本文标题:iOS知识点-P3

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