面试

作者: 夜雨聲煩_ | 来源:发表于2022-03-01 19:01 被阅读0次

KVC

KVC可以通过key直接访问对象的属性,或者给对象的属性赋值(包括私有属性),这样可以在运行时动态的访问或修改对象的属性。

setValue forKey
Person *person = [[Person alloc] init];
[person setValue:@"小明" forKey:@"userName"];
NSString *name = [person getPrivateName];
NSLog(@"person private name:%@",name);
  • 首先要调用对象的setter方法。
  • 如果没有找到对应的属性,会找相应的_name成员变量。
  • 如果还是没有找到,会执行- (void)setValue:(id)value forUndefinedKey:(NSString *)key方法。可以在方法里做响应的属性名转换。如果没有实现此方法,则会异常崩溃。
  • 如果想禁用KVC,+ (BOOL)accessInstanceVariablesDirectly中返回NO,默认是返回YES
valueForKey
  • 首先要调用对象的getter方法。
  • 如果没有找到,会执行- (id)valueForUndefinedKey:(NSString *)key,在此方法里可以进行处理。如果没有实现此方法,则会异常崩溃。
  • 如果想禁用KVC,+ (BOOL)accessInstanceVariablesDirectly中返回NO,默认是返回YES
setValue:forKeyPath,valueForKeyPath

valueForKeyPath的值是一个路径(路径之间以点号 . 分割),比如数据成员就是对象自己,寻值过程就会向下深入下去。

autoreleasepool

main函数中的autoreleasepool从技术上看是非必要的,去掉没有什么关系。但为了严谨,为了让UIApplication创建出来的自动释放的对象有自动释放池可添加,而不是依赖程序结束后的内存回收。
APP启动的时候会在主线程注册两个observer,一个监听即将进入runloop事件,一个监听runloop即将休眠和即将退出两个事件,在runloop即将休眠和即将退出的时候会销毁@autoreleasepool{}释放自动释放池,并释放autorelease对象。

实现方式

当自动释放池创建的时候,会调用objc_autoreleasePoolPush方法,将POOL_SENTINEL(哨兵对象)放入到栈顶。随后自动释放池内的对象会被加到栈顶中。
当自动释放池释放的时候,会调用objc_autoreleasePoolPop方法,向自动释放池中的对象释放release方法,直到POOL_SENTINEL(哨兵对象)。

POOL_SENTINEL 只是 nil 的别名。

autoreleasepool是由多个autoreleasePoolPage以双向链表的形式链接起来的,当一个表满了,会自动创建下一个表,并双向链接起来。释放的时候,从最下面依次向上pop,调用每个对象的release,直到遇到标志位(POOL_SENTINEL)。

结构

autoreleasepool实际上是一个结构体,结构如下

class AutoreleasePoolPage {
    magic_t const magic;    //AutoreleasePoolPage 完整性校验
    id *next;                             //下一个存放autorelease对象的地址
    pthread_t const thread; //所在线程
    AutoreleasePoolPage * const parent;  //父节点 (双向)
    AutoreleasePoolPage *child;                 //子节点 (双向)
    uint32_t const depth;
    uint32_t hiwat;
};

内省(Introspection)

内省是面向对象语言和环境的一种特性,是在运行时(Run time)检查对象(object)的一种能力。可以通过内省,来判断对象在继承树上的位置,是否遵循特定的协议,是否可以响应特定的消息。
优点:
内省可以使面向对象程序更强壮高效,避免进行错误的消息派发,错误的假设对象。
最常见应用:

if (self.delegate && [self.delegate respondsToSelector:@selector(segmentDidChanged:)]) {
        [self.delegate segmentDidChanged:type];
 }
常用的几个内省方法:
  • isMemberOfClass : 对象是否是某个类的对象。
  • isKindOfClass : 对象是否是某个类或者某个类子类的对象。
  • isSubclassOfClass : 某个类是否是另一个类的子类。
  • respondsToSelector : 是否能响应某个方法。
  • conformsToProtocol : 是否遵循某个协议。
class方法和object_getClass方法区别
  • 实例的class方法就是直接返回object_getClass(self)
  • 类的class方法直接返回self
  • object_getClass(类)方法则返回元类。

Dealloc

http://events.jianshu.io/p/b25f50d852f2

相关文章

  • 面试者

    面试面试面试

  • 行为性面试 #3.1.9

    面试主要分类 按面试内容:结构化面试、非结构化面试、半结构面试。 按面试中提问类型:行为性面试、情景性面试、动机面...

  • 面试的构成要素

    面试要素是指构成任何一次面试活动必不可少的基本因素。面试因素有10个:面试目的、面试内容、面试方法、面试考官、面试...

  • 面试材料

    面试经验 面试题1 面试题2 面试题3 面试题4 面试题5 面试题6――数据结构 面试题7――网络 面试题8――汇...

  • 测评工具

    一、笔试/机考 针对专业性强岗位 二、面试 电话面试/视频面试/技术面试/HR面试/综合面试 1.半结构化面试:面...

  • 面试面试面试伤神伤神

    面试面试面试伤神伤神

  • 思维导图助力面试

    面试前 面试中 面试后

  • 12套JAVA高级面试课程(只为冲高薪准备)

    12套JAVA高级面试课程,BAT高级面试,架构师面试,高级工程师面试,java就业面试,校招面试,算法面试,my...

  • 前端面试知识点整理

    面试1:CSS布局面试2:CSS盒模型面试3:flex弹性盒布局面试4:DOM面试5:原型链面试6:面向对象面试7...

  • 掌握这些套路,90%的面试都能过!!

    面试面试面试,走进大学我们开始发现: 进学生会要面试,进社团也要面试,考研保研都要面试,找工作更是有长达五论面试!...

网友评论

      本文标题:面试

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