iOS高级面试

1、修饰属性有哪几个?追问 为什么用copy?weak对象为nil的底层原理?
2、block是什么?block有几种?追问 为什么__block修饰的值在内部可以改变
3、字典大致实现原理
4、一般开始做一个项目,你的架构是如何思考的?
5、runLoop机制?source0是什么?source1是什么?追问 事件响应时怎么通知runLoop的?
6、runtime是什么?superclass是什么类型的?math_list里有什么?追问SEL里面有什么(知道的请告诉我,查资料没找到)?
7、objc_class结构体
一、类在OC中是objc_class的结构体指针 typedef struct objc_class *Class;
在objc/runtime.h中objc_class结构体的定义如下:

        Class isa  OBJC_ISA_AVAILABILITY;
        #if !__OBJC2__
        Class super_class                       OBJC2_UNAVAILABLE;  // 父类
        const char *name                        OBJC2_UNAVAILABLE;  // 类名
        long version                                OBJC2_UNAVAILABLE;  // 类的版本信息,默认为0
        long info                                      OBJC2_UNAVAILABLE;  // 类信息,供运行期使用的一些位标识
        long instance_size                      OBJC2_UNAVAILABLE;  // 该类的实例变量大小
        struct objc_ivar_list *ivars           OBJC2_UNAVAILABLE;  // 该类的成员变量链表
        struct objc_method_list **methodLists   OBJC2_UNAVAILABLE;  // 方法定义的链表
        struct objc_cache *cache                       OBJC2_UNAVAILABLE;  // 方法缓存
        struct objc_protocol_list *protocols        OBJC2_UNAVAILABLE;  // 协议链表
        #endif
} OBJC2_UNAVAILABLE;

isa: 指向元类的objc_class结构体指针,iOS中的类也是对象,元类中储存有类对象的类方法;
superclass: 指向父类的objc_class结构体指针,可以通过父类的指针找到变量和方法;
name: 类名;
version: 版本号,默认为0
info: 其他信息,运行期间的一些位标示
instance_size:类实例变量大小

objc_class的定义

我们在使用runtime以class为前缀的方法时主要就是针对这个结构体中的各个字段的。

指向元类的指针(isa)

在OC中所有的类其实也是一个对象,那么这个对象也会有一个所属的类,这个类就是元类也就是结构体里面isa指针所指的类。

7、那什么是元类呢?
元类的定义:元类就是类对象的类。每个类都有自己的元类,因为每个类都有自己独一无二的方法。
简单点说就是:
当你给对象发送消息时,消息是在寻找这个对象的类的方法列表。(实例方法)
当你给类发消息时,消息是在寻找这个类的元类的方法列表。(类方法)

那元类的类是什么呢?
元类,就像之前的类一样,它也是一个对象。你也可以调用它的方法。自然的,这就意味着他必须也有一个类。

所有的元类都使用根元类(继承体系中处于顶端的类的元类)作为他们的类。这就意味着所有NSObject的子类(大多数类)的元类都会以NSObject的元类作为他们的类

根据这个规则,所有的元类使用根元类作为他们的类,根元类的元类则就是它自己。也就是说基类的元类的isa指针指向他自己。

这里有一副图可以很好的展现这些关系:


20170630090350207.jpeg

8、category是啥?category为什么不能添加属性?有办法解决吗?
//Category表示一个结构体指针的类型

typedef struct objc_category *Category;
struct objc_category {
    char * _Nonnull category_name                            OBJC2_UNAVAILABLE;
    char * _Nonnull class_name                               OBJC2_UNAVAILABLE;
    struct objc_method_list * _Nullable instance_methods     OBJC2_UNAVAILABLE;
    struct objc_method_list * _Nullable class_methods        OBJC2_UNAVAILABLE;
    struct objc_protocol_list * _Nullable protocols          OBJC2_UNAVAILABLE;
}                                                            OBJC2_UNAVAILABLE;

分类特点
1.分类是用于给原有类添加方法的,因为分类的结构体指针中,没有属性列表,只有方法列表。原则上讲它只能添加方法, 不能添加属性(成员变量),实际上可以通过其它方式添加属性 ;
2.分类中的可以写@property, 但不会生成setter/getter方法, 也不会生成实现以及私有的成员变量,会编译通过,但是引用变量会报错;
3.如果分类中有和原有类同名的方法, 会优先调用分类中的方法, 就是说会忽略原有类的方法,同名方法调用的优先级为 分类 > 本类 > 父类;

可以通过关联对象给Category添加属性

@interface NSObject (Extension)
@property (nonatomic,copy  ) NSString *name;
@end
@implementation NSObject (Extension)
- (void)setName:(NSString *)name {
    objc_setAssociatedObject(self, @selector(name), name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (NSString *)name {
    return objc_getAssociatedObject(self,@selector(name));
}

@end

上面是把我们看到的现象进行分析,思考其为什么会有这样的现象呢?分类并不会改变原有类的内存分布的情况,它是在运行期间决定的,此时内存的分布已经确定,若此时再添加实例会改变内存的分布情况,这对编译性语言是灾难,是不允许的。

9、如果一个类有两个相同的分类,系统会调用哪个分类的方法?
10、KVO怎么实现,_会不会触发,成员变量会不会触发,kvc+成员变量会不会触发,不用setter怎么触发kvo
答. 当一个对象使用了KVO监听,iOS系统会修改这个对象的isa指针,
改为指向一个全新的通过Runtime动态创建的子类,子类拥有自己的set方法实现,
set方法实现内部会顺序调用willChangeValueForKey方法、原来的setter方法实现、
didChangeValueForKey方法,而didChangeValueForKey方法内部
又会调用监听器的observeValueForKeyPath:ofObject:change:context:监听方法。

如何手动触发KVO
答. 被监听的属性的值被修改时,就会自动触发KVO。
如果想要手动触发KVO,则需要我们自己调用willChangeValueForKey和
didChangeValueForKey方法即可在不改变属性值的情况下手动触发KVO
,并且这两个方法缺一不可。

11、iOS反射机制?
12、iOS的timer和CADisplay的区别?
13、用过 TableView 吗,平时怎么解决 TableView 滑动卡顿问题的?
14、谈谈对多线程的使用和理解?
15、项目中遇到过abort()吗?如何定位和解决abort()?

备用:
iOS有哪几种锁?比较各种锁的优缺点?并给出实例场景判断用哪种锁

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容

  • 面向对象的三大特性:封装、继承、多态 OC内存管理 _strong 引用计数器来控制对象的生命周期。 _weak...
    运气不够技术凑阅读 1,092评论 0 10
  • 一千个读者眼中有一千个哈姆雷特,一千名 iOS 程序员心目中就有一千套 iOS 高级面试题。本文就是笔者认为可以用...
    iOS弗森科阅读 1,442评论 0 13
  • 题目: 出处:先是程序员,然后才是iOS程序员 — 写给广大非科班iOS开发者的一篇面试总结如果让你实现属性的we...
    林大鹏阅读 1,154评论 0 13
  • 文/西风雨冥 我看着咖啡店里的装潢, 竟浮现出中世纪的模样。 书架上一本深奥的书 勾引我去阅读。 可突然想到, 倘...
    西风雨冥阅读 160评论 0 4
  • 感赏我能够转化负能量,感赏我不和老公对抗,感赏我时时提醒自己不聚焦在负面上,感赏我接纳孩子的现状,并且接纳孩子的现...
    一切随缘666阅读 192评论 0 4