美文网首页
iOS 面试 - 基础

iOS 面试 - 基础

作者: Crics | 来源:发表于2019-06-29 03:38 被阅读0次

编译链接的过程?

你知道哪些编码方式?

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

内核态和用户态的区别?

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

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这种扩展能力得到了更好的体现。


相关文章

网友评论

      本文标题:iOS 面试 - 基础

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