编译链接的过程?
你知道哪些编码方式?
程序在运行时操作系统除了分配内存空间还有什么?
内核态和用户态的区别?
堆和栈的区别,工程项目中的哪些数据是储存在堆哪些在栈中
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区别
多层自动释放池嵌套的对象在哪一层释放
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这种扩展能力得到了更好的体现。
网友评论