iOS 面试 - 基础

编译链接的过程?


你知道哪些编码方式?


程序在运行时操作系统除了分配内存空间还有什么?


内核态和用户态的区别?


堆和栈的区别,工程项目中的哪些数据是储存在堆哪些在栈中

1、栈(stack):方法调用,局部变量等,是连续的,高地址往低地址扩展。

2、堆(heap):通过alloc等分配的对象,是离散的,低地址往高地址扩展,需要我们手动控制。

3、未初始化数据(bss):未初始化的全局变量等。

4、已初始化数据(data):已初始化的全局变量等。

5、代码段(text):程序代码。

静态方法是否能被重写?


OOA、OOD、OOP?

OOA(Object Oriented Analysis):面向对象分析

OOD(Object Oriented Design):面向对象设计

OOP(Object Oriented Programming):面向对象编程

OC中对象的结构


OC中的内省?

对象在运行时获取其类型的能力称为内省。

OC运行时内省的4个方法:

判断对象类型:

        1、-(BOOL) isKindOfClass: 判断是否是这个类或者这个类的子类的实例

        2、-(BOOL) isMemberOfClass: 判断是否是这个类的实例

判断对象/类是否有这个方法:

        1、-(BOOL) respondsToSelector: 判读实例是否有这样方法

        2、+(BOOL) instancesRespondToSelector: 判断类是否有这个方法

id和nill代表什么(nill和NULL的区别)

1、id 声明的对象具有运行时的特性,即可以指向任意类型的Objcetive-C的对象。

2、nil:空指针,不指向任何位置的指针。

3、NULL:指针存储的地址是一个空地址。

向一个nill对象发送消息会发生什么?

首先需要明白2个问题:

        什么是isa指针?

        消息传递机制?

1、isa指针是用于对象指向类对象,类对象指向元类对象的一个指针。而类对象和元类对象中又分别存放对象方法和类方法。 在消息传递机制中,就是通过isa指针来寻找到方法的实际调用地址的。

2、objc在向一个对象发送消息时,runtime库会根据对象的isa指针找到该对象实际所属的类,然后在该类中的方法列表以及其父类方法列表中寻找方法运行,然后在发送消息的时候,objc_msgSend方法不会返回值,所谓的返回内容都是具体调用时执行的。 那么,回到本题,如果向一个nil对象发送消息,首先在寻找对象的isa指针时就是0地址返回了,所以不会出现任何错误。  

多态

不同对象以自己的方式响应相同的消息的能力叫做多态。

@property的本质是什么?

@property = ivar + getter + setter;

“属性” (property)有两大概念:ivar(实例变量)、getter+setter(存取方法)

“属性” (property)作为 Objective-C 的一项特性,主要的作用就在于封装对象中的数据。 Objective-C 对象通常会把其所需要的数据保存为各种实例变量。实例变量一般通过“存取方法”(access method)来访问。其中,“获取方法” (getter)用于读取变量值,而“设置方法” (setter)用于写入变量值。

 @property中有哪些属性关键字?

1.原子性--- atomic、nonatomic特质

2.读/写权限---readwrite(读写)、readonly (只读)

3.内存管理语义---assign、strong、 weak、unsafe_unretained、copy

4.方法名---getter=<name> 、setter=<name>

5.不常用的:nonnull,null_resettable,nullable

解释属性修饰关键词的作用

1、 readwrite 是可读可写特性。需要生成getter方法和setter方法。

 2)、readonly 是只读特性。只会生成getter方法,不会生成setter方法,不希望属性在类外改变。

 3、assign 是赋值特性。setter方法将传入参数赋值给实例变量;仅设置变量时,assign用于基本数据类型。

 4、 retain(MRC)/strong(ARC) 表示持有特性。setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1。 

5、copy 表示拷贝特性。setter方法将传入对象复制一份,需要完全一份新的变量时。 

6、nonatomic 非原子操作。决定编译器生成的setter和getter方法是否是原子操作,atomic表示多线程安全(非绝对),一般使用nonatomic,效率高。

浅拷贝和深拷贝的区别

浅拷贝:只复制指向对象的指针,而不复制引用对象本身。

深拷贝:复制引用对象本身。内存中存在了两份独立对象本身,当修改A时,A_copy不变。

assign、weak

1、ARC中,有可能出现循环引用的时候,让一短使用weak。没必要强引用的时候,使用weak,IBOutlet控件属性,当然也可以用strong。

2、weak、assign修饰的属性指向一个对象时,都不会增加对象的引用计数。然而在所指的对象被释放掉时,weak属性值会被自动置为nil,而assign属性不会。

3、assign可以用于非OC对象及基本类型,weak必须用于OC对象。

copy和strong的区别


weak原理

详情:

1、weak其实是系统通过一个hash表来实现对象的弱引用。

2、runtime维护了一个weak表,用于存储指向某个对象的所有weak 指针。weak表其实是一个hash表,Key是所有对象的地址,Value是weak指针 的地址(这个地址的值是所有对象指针的地址)数组。

原理:

1、初始化时:runtime会调用objc_initWeak函数,初始化一个新的weak指针指向对象的地址

2、添加引用时:objc_initWeak函数会调用storeWeak(),StoreWeak()的作用是更新指针指向,创建对应的弱引用表

3、释放时:调用clearDeallocting()。clearDeallocting()首先根据对象地址获取所有weak指针地址的数组,然后遍历这个数组把其中的数据设为 nil,最后把这个entry从weak表中删除,最后清理对象的记录

为什么不可变对象要用copy


iOS中的NSCopying协议,copy、mutableCopy的区别

- (id)copyWithZone:(NSZone *)zone;

copy 返回的是不可变对象(immutableObject);如果用copy返回值调用mutable对象的方法就会crash。

 mutableCopy 返回的是可变对象(mutableObject)。

1、非集合类对象

        对不可变对象进行copy操作,是指针复制,mutableCopy操作是内容复制; 对可变对象进行copy和mutableCopy都是内容复制。

2、集合类对象

        对不可变对象进行copy操作,是指针复制,mutableCopy操作是内容复制; 对可变对象进行copy和mutableCopy都是内容复制。但是:集合对象的内容复制仅限于对象本身,对集合内的对象元素仍然是指针复制。(即单层内容复制)

总结:只有对不可变对象进行copy操作是指针复制(浅复制),其它情况都是内容复制(深复制)。

如果属性完全不加修饰词如weak,atomic,系统会怎么处理

对象:@property (atomic, strong, readwrite) xxx

非对象: @property (atomic, assign, readwrite) xxx

内存管理

OC的内存管理主要有三种方式ARC(自动内存计数)、MRC(手动内存计数)、内存池。

1、自动内存计数ARC:由Xcode自动在App编译阶段,在代码中添加内存管理代码。

2、 手动内存计数MRC:遵循内存谁申请、谁释放;谁添加,谁释放的原则。

3、内存释放池Release Pool:把需要释放的内存统一放在一个池子中,当池子被抽干后(drain),池子中所有的内存空间也被自动释放掉。内存池的释放操作分为自动和手动。自动释放受runloop机制影响。

简述下block的实现

闭包(block):闭包就是获取其它函数局部变量的匿名函数。

Block的循环引用、如何解决、原理

1、在block内部使用外部指针且会造成循环引用情况下,需要用__week修饰外部指针:

        __weak typeof(self) weakSelf = self;

2、在block内部如果调用了延时函数还使用弱指针会取不到该指针,因为已经被销毁了,需要在block内部再将弱指针重新强引用一下。

        __strong typeof(self) strongSelf = weakSelf;

3、如果需要在block内部改变外部栈区变量的话,需要在用__block修饰外部变量。

说说你对内存泄漏的看法,追问,block为什么容易引起内存泄漏?


对于block理解,MRC和ARC下有什么区别,使用注意事项


Block和函数指针的区别?


[object copy]是浅拷贝还是深拷贝?为什么是浅拷贝?copy是实现了哪个协议?


对MRC和ARC的理解


谈对引用计数的理解


谈谈对自动释放池的理解

自动释放池:以栈的形式实现,当你创建一个新的自动释放池时,它将被添加到栈顶。当一个对象收到发送 autorelease 消息时,它被添加到当前线程的处于栈顶的自动释放池中,当自动释放池被回收时,它们从栈中被删除, 且会给池子里面所有的对象都会做一次 release 操作。

主要通过下列三个函数完成:

        objc_autoreleasepoolPush

        objc_autoreleasepoolPop

        objc_autorelease

自动释放池在MRC和ARC区别


多层自动释放池嵌套的对象在哪一层释放

autorelease变量什么时候释放?

1、手动添加的是大括号结束的时候释放

2、系统自动释放是在当前runloop循环结束的时候

那子线程中的autorelease变量什么时候释放?


子线程里面,需要加autoreleasepool吗


category和extension区别,系统如何底层实现category


单例和全局变量的区别。


iOS 为什么没有类似于 Java 和 C 之类的 “Builder” 的构造模式


Block和Protocol的区别,Block是为了解决什么问题而使用的


OC的反射机制

1、Class的反射

        FOUNDATION_EXPORT NSString *NSStringFromClass(Class aClass);

        FOUNDATION_EXPORT Class __nullable NSClassFromString(NSString *aClassName);

2、SEL的反射

        FOUNDATION_EXPORT NSString *NSStringFromSelector(SEL aSelector);

        FOUNDATION_EXPORT SEL NSSelectorFromString(NSString *aSelectorName);

3、Protocol

        FOUNDATION_EXPORT NSString *NSStringFromProtocol(Protocol *proto) NS_AVAILABLE(10_5, 2_0);

        FOUNDATION_EXPORT Protocol * __nullable NSProtocolFromString(NSString *namestr) NS_AVAILABLE(10_5, 2_0);

实例:

根据后台推送过来的数据,进行动态页面跳转,跳转到页面后根据返回到数据执行对应的操作。


iOS是如何进行资源管理的


一张图片的内存占用大小是由什么决定的


索引有什么用?

创建索引可以大大提高系统的性能。

1、通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

2、可以大大加快数据的检索速度,这也是创建索引的最主要的原因。

3、可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

4、在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。

5、通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

存一个通讯录,包括增删改查,用什么数据结构


isEquel和hash的关系


bitmap的结构


数组的浅拷贝与深拷贝


字典的工作原理 ?怎100w个中是怎么快速去取value?


数据库


JSON、XML

1、JSON与XML的区别:

(1)可读性方面:基本相同,XML的可读性比较好;

(2)可扩展性方面:都具有良好的扩展性;

(3)编码难度方面:相对而言,JSON的编码比较容易;

(4)解码难度:JSON的解码难度基本为零,XML需要考虑子节点和父节点;

(5)数据体积方面:JSON相对于XML来讲,数据体积小,传递的速度比较快;

(6)数据交互方面:JSON与javascript的交互更加方便,更容易解析处理,更好的数据交互;

(7)数据描述方面:XML对数据描述性比较好

(8)传输速度方面:JSON的速度远远快于XML。

2、JSON与XML底层实现原理:

(1)JSON底层原理:遍历字符串中的字符,最终根据格式规定的特殊字符,比如{}、[]、:等进行区分,{}号表示字典,[]号表示数组,:号是字典的键和值的分水岭,最终仍是将JSON转化为字典,只不过字典中的值可能是“字典、数组或者字符串而已”。

(2)XML底层原理:XML解析常用的解析方法有两种:DOM解析和SAX解析;DOM采用的是树形结构的方式访问XML文档,而SAX采用的是事件模型;DOM解析把XML文档转化为一个包含其内容的树,并可以对树进行遍历,使用DOM解析器的时候需要处理整个XML文档,所以对内存和性能的要求比较高;SAX在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,他可以激活一个回调方法,告诉该方法指定的标签已经找到,SAX对内存的要求通常会比较低,因为他让开发人员自己来决定所要处理的tag,特别是当开发人员只需要处理文档中所包含部分数据时,SAX这种扩展能力得到了更好的体现。




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

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,096评论 1 32
  • 1、简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与allo...
    韦鲁斯阅读 2,134评论 6 25
  • 内存管理 简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与a...
    丶逐渐阅读 1,963评论 1 16
  • 1.简述OC中内存管理机制 答:内存管理机制:使用引用计数管理,分为ARC和MRC,MRC需要程序员自己管理内存,...
    Manba_小洛阅读 552评论 0 2
  • 昨天在大堤上散步,偶遇蜂农,端详些许。他仔细地打开蜂箱,一片片检查着小东西们,把几近充盈的板巢挑出来,估计是拿去摇...
    静观风阅读 228评论 0 0