美文网首页
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