1.8、iOS面试题之语法

作者: zmfflying | 来源:发表于2020-06-14 14:41 被阅读0次

    1、isa指针?(对象的isa,类对象的isa,元类的isa都要说)

    对象的isa指针指向所属的类

    类的isa指针指向了所属的元类

    元类的isa指向了根元类,根元类指向了自己。

    2、类方法和实例方法有什么区别?

    类方法:

    类方法是属于类对象的

    类方法只能通过类对象调用

    类方法中的 self 是类对象

    类方法可以调用其他的类方法

    类方法中不能访问成员变量

    类方法中不能直接调用对象方法

    实例方法:

    实例方法是属于实例对象的

    实例方法只能通过实例对象调用

    实例方法中的 self 是实例对象

    实例方法中可以访问成员变量

    实例方法中直接调用实例方法

    实例方法中也可以调用类方法(通过类名)

    3、介绍一下分类,能用分类做什么?内部是如何实现的?它为什么会覆盖掉原来的方法?

    https://www.jianshu.com/p/fa66c8be42a2

    分类的实现原理是将category中的方法,属性,协议数据放在category_t结构体中,然后将结构体内的方法列表拷贝到类对象的方法列表中。

    后编译的分类先调用,因为每次编译的分类都会放到数组的前面去,本类的在最后

    4、运行时能增加成员变量么?能增加属性么?如果能,如何增加?如果不能,为什么?

    可以添加属性的,但必须我们实现它的getter和setter方法。但是没有添加带下滑线同名的成员变量

    但是我们使用runtime的关联对象实现添加成员变量

    6、objc中向一个nil对象发送消息将会发生什么?(返回值是对象,是标量,结构体)

    如果一个方法返回值是一个对象,那么发送给nil的消息将返回0(nil)。例如:Person * motherInlaw = [ aPerson spouse] mother]; 如果spouse对象为nil,那么发送给nil的消息mother也将返回nil。

    如果方法返回值为指针类型,其指针大小为小于或者等于sizeof(void*),float,double,long double 或者long long的整型标量,发送给nil的消息将返回0。

    如果方法返回值为结构体,正如在《Mac OS X ABI 函数调用指南》,发送给nil的消息将返回0。结构体中各个字段的值将都是0。其他的结构体数据类型将不是用0填充的。

    如果方法的返回值不是上述提到的几种情况,那么发送给nil的消息的返回值将是未定义的。

    7、我们说的Objective-C是动态运行时语言是什么意思?

    object-c类的类型和数据变量的类型都是在运行是确定的,而不是在编译时确定。例如:多态特性,我们可以使用父类对象来指向子类对象,并且可以用来调用子类的方法。运行时(runtime)特性,我们可以动态的添加方法,或者替换方法。

    8、OC中对象的结构

    https://www.jianshu.com/p/d2d9854bea7c

    实例对象,就是前面创建的对象,里面存放isa指针(指向类对象)和成员变量的值信息.

    类对象,Class,存放isa指针(需要 & ISA_MASK,指向元类对象),superclass指针(指向父类),协议信息,属性信息,成员变量描述信息,对象方法信息...

    元类对象,isa指针(需要 & ISA_MASK,指向根原类对象),superclass指针(指向父元类对象),类方法信息...

    9、多态

    https://www.jianshu.com/p/83f174b493d6

    什么是多态

    多态一般都要跟继承结合起来说,其本质是子类通过覆盖或重载父类的方法,来使得对同一类对象同一方法的调用产生不同的结果。这里需要辨析的地方在:同一类对象指的是继承层级再上一层的对象,更加泛化。

    程序中的多态:父类指针指向子类对象

    多态的原理

    动态绑定

    动态类型能使程序直到执行时才确定对象的真实类型

    动态类型绑定能使程序直到执行时才确定要对那个对象调用的方法

    多态条件

    有继承关系

    子类重写父类方法

    父类指针指向子类对象

    10、如何访问并修改一个类的私有属性?

    https://www.jianshu.com/p/a667f0ce9573

    对ios 类私有属性的访问和修改有两种方法:

    一种方法是通过KVC进行处理(需要知道属性的名字)

    一种就是Runtime (object_setIvar  object_getIvar)

    11、讲一下MVC和MVVM,MVP?

    https://www.jianshu.com/p/d0bc12a63ccf

    https://www.jianshu.com/p/37b907cbd0e3

    简单来说MVC(Model View Controller)就是模型(Model)- 视图(View)-控制器(Controller)的缩写,Model是用来处理数据,View是用来展示界面,Cotroller是用来调节他们两者之间的交互。

    这个是最常用的。但是View和Model之间的直接交互,就导致了View和Model之间的耦合性比较大。

    MVP (Model View Presenter)是MVC模式的变种,使用Presenter代替了Controller,而且改变了数据流向

    View和Model之间不再直接进行交互,而是通过Presenter来进行的。总体来说Presenter同时持有View和Model。

    优点:整体框架分层清晰,降低了耦合度。

    缺点:需要加入Presenter来作为协调Model和View的桥梁,同时也导致了Presenter的臃肿。在维护起来不方便。

    MVVM(Model View View-Model ViewModel)其实是对MVP的一种改进,他将Presenter替换成ViewModel,并通过双向数据绑定来实现视图和数据的交互。

    优点:使其数据流向更加清晰(脑补一下就是云对雨,x对风,大陆对长空)。一一对应起来。

    缺点:这种架构没有统一的实现方式,每个人各有特色。我接触过得各有不同。而且有一定的学习成本。

    12、MVVM如何实现绑定

    https://blog.csdn.net/linpeng_1/article/details/82316857

    mvvm是一种架构模式,虽然不依赖其他东西,但在iOS上还是会ReactiveCocoa实现起来方便一点,RAC(self. userNameLabel, text) = RACObserve(self. viewModel, userName);

    比如这个,label和viewModel中的userName绑定,ViewModel中的userName改变时,userNameLabel会自动更新,而不用你手动setText

    13、为什么代理要用weak?代理的delegate和dataSource有什么区别?block和代理的区别?

    14、属性的实质是什么?包括哪几个部分?属性默认的关键字都有哪些?@dynamic关键字和@synthesize关键字是用来做什么的?

    1、@dynamic:修饰的属性、其getter和setter方法编译器不会自动生成、必须需要自己实现。如果自己没有实现getter和setter方法、编译时没问题,运行时执行对应的方法(动态绑定)时会导致程序崩溃。

    2、@synthesize:修饰的属性、其getter和setter方法编译器会自动生成,不需要自己实现。且指定与属性相对应的成员变量。

    3、如果一个属性(@property)没有用dynamic和synthesize修饰,那么默认的是@synthesize var = _var;

    15、属性的默认关键字是什么?

    16、NSString为什么要用copy关键字,如果用strong会有什么问题?(注意:这里没有说用strong就一定不行。使用copy和strong是看情况而定的)

    17、nonatomic和atomic的区别?atomic是绝对的线程安全么?为什么?如果不是,那应该如何实现?

    atomic 只是对属性的 getter/setter 方法加自旋锁,也就是对A加锁,这样可以保证A是线程安全的。这样并没有对B做任何处理所以B不是线程安全的。如果一个对象的改变不是直接调用 getter/setter 方法,而是直接对对象内部属性修改、字符串拼接、数组增加和移除元素等操作,就不能保证这个对象是线程安全的。需要用互斥锁来保证线程安全性

    18、week和assing的区别,了不了解week的底层实现;

    19、自定义实现set方法该怎么实现;

    20、简述kvo、kvc、Delegate他们之间的区别?

    21、KVO的使用?实现原理?(为什么要创建子类来实现)

    22、KVC的使用?实现原理?(KVC拿到key以后,是如何赋值的?知不知道集合操作符,能不能访问私有属性,能不能直接访问_ivar)

    23、KVO模式的实现过程;

    https://www.jianshu.com/p/5477cf91bb32

    当一个对象使用了KVO监听,iOS系统会修改这个对象的isa指针,改为指向一个全新的通过Runtime动态创建的子类,子类拥有自己的set方法实现,set方法实现内部会顺序调用willChangeValueForKey方法、原来的setter方法实现、didChangeValueForKey方法,而didChangeValueForKey方法内部又会调用监听器的observeValueForKeyPath:ofObject:change:context:监听方法。

    24、KVO模式中监听者使用的observeForKeyPath方法中的change是什么类型的;

    NSDictionary

    25、Objective-C与C、C+++之间的联系和区别?

    https://blog.csdn.net/lyc_omg/article/details/25150851

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

    27、进程间通信的方式

    https://blog.csdn.net/kuangdacaikuang/article/details/78891379

    1 URL Scheme

    2 Keychain

    3 UIPasteboard

    4 UIDocumentInteractionController

    5 local socket

    6 AirDrop

    7 UIActivityViewController

    8 App Groups

    28、了解哪些设计模式

    29、NSCache优于NSDictionary的几点?

    1.nscache 是可以自动释放内存的。

    2.nscache是线程安全的,我们可以在不同的线程中添加,删除和查询缓存中的对象。

    3.一个缓存对象不会拷贝key对象。

    30、编译过程做了哪些事情?

    1. 写入辅助文件:将项目的文件结构对应表、将要执行的脚本、项目依赖库的文件结构对应表写成文件,方便后面使用;并且创建一个 .app 包,后面编译后的文件都会被放入包中。

    2. 运行预设脚本:Cocoapods 会预设一些脚本,当然你也可以自己预设一些脚本来运行。这些脚本都在 Build Phases 中可以看到。

    3.编译文件:针对每一个文件进行编译,生成可执行文件 Mach-O,这过程涉及 LLVM 的完整流程,包括前端、优化器、后端。

    4. 链接文件:将项目中的多个可执行文件合并成一个文件。

    5. 拷贝资源文件:将项目中的资源文件拷贝到目标包;

    6. 编译 storyboard 文件:storyboard 文件也是会被编译的;

    7. 链接 storyboard 文件:将编译后的 storyboard 文件链接成一个文件;

    8. 编译 Asset 文件:我们的图片如果使用 Assets.xcassets 来管理图片,那么这些图片将会被编译成机器码,除了 icon 和 launchImage;

    9. 运行 Cocoapods 脚本:将在编译项目之前已经编译好的依赖库和相关资源拷贝到包中。

    10. 对包进行签名

    11. 完成打包

    31、字典大致实现原理;

    https://www.cnblogs.com/higerMan/p/11907117.html

    32、你了解的UIKit结构?

    33、项目里面的数据存储都用了哪些?知道iOS里面有哪些数据存储方法?什么时候该用哪些方法存储?

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

    35、数据持久化的几个方案(fmdb用没用过)

    36、block和通知的区别,分别适用什么场景

    37、在block里面使用_property会造成循环引用吗?怎么解决?除了使用self->_property,可以使用valueforkey来访问吗  在block里面可以修改它的值吗setvalueforkey?可以修改它的值,可以用valueforkey来解决,显式的的使用self,block外先持有self的弱引用。

    38、block的实质是什么?一共有几种block?都是什么情况下生成的?

    39、使用系统的某些block api,是否考虑引用循环问题?

    40、谈谈block的理解?并写出一个使用block执行UIVew动画?

    41、Viewcontroller的生命周期?

    1.initWithCoder:        通过 nib 文件初始化时触发。

    2. awakeFromNib:          nib 文件被加载的时候,会发生一个 awakeFromNib 的消息到 nib 文件中的每个对象。     

    3. loadView:              开始加载视图控制器自带的 view。

    4. viewDidLoad:          视图控制器的 view 被加载完成。 

    5. viewWillAppear:        视图控制器的 view 将要显示在 window 上。

    6. updateViewConstraints: 视图控制器的 view 开始更新 AutoLayout 约束。

    7. viewWillLayoutSubviews:视图控制器的 view 将要更新内容视图的位置。

    8. viewDidLayoutSubviews: 视图控制器的 view 已经更新视图的位置。

    9. viewDidAppear:        视图控制器的 view 已经展示到 window 上。 

    10. viewWillDisappear:    视图控制器的 view 将要从 window 上消失。

    11. viewDidDisappear:    视图控制器的 view 已经从 window 上消失。

    42、在init方法里面,设置背景颜色,会生效吗 会生效。为什么会?

    43、WWDC公布了哪些新特性?对苹果系列的最新特性有关注吗

    44、看过哪些源码,讲讲思路

    45、说一下AppDelegate的几个方法?从后台到前台调用了哪些方法?第一次启动调用了哪些方法?从前台到后台调用了哪些方法?

    https://www.jianshu.com/p/f5777028e7b7

    46、知不知道Designated Initializer?使用它的时候有什么需要注意的问题?

    指定初始化方法的机制保证了对象会依次执行从父类到子类的所有初始化逻辑,实现的规则为:

    便捷初始化方法只能调用本类中的其他初始化方法,并最终调用到指定初始化方法。

    子类的指定初始化方法要调用父类的指定初始化方法,以保证父类的初始化逻辑可以执行。

    当子类实现了自己的指定初始化方法后,父类的指定初始化方法要重写为便捷初始化方法,以保证所有初始化方法都能调用到子类的初始化逻辑。

    47、实现description方法能取到什么效果?

    description是nsobject的一个实例的方法,返回的是一个nsstring。当我们使用nslog打印的时候,打印出来的一般都是对象的内存地址,如果我们实现description方法时,我们就可以使用nslog打印对象的时候,我们可以把它里面的属性值和内存地址一起打印出来.打印什么,就是看你写什么了。

    48、include与#import的区别?#import与@class的区别?

    49、如何令自己所写的对象具有拷贝功能?

    如果想让自己的类具备copy方法,并返回不可边类型,必须遵循nscopying协议,并且实现 - (id)copyWithZone:(NSZone *)zone

    如果让自己的类具备mutableCopy方法,并且放回可变类型,必须遵守NSMutableCopying,并实现- (id)mutableCopyWithZone:(nullable NSZone *)zone

    注意:再此说的copy对应不可边类型和mutableCopy对应不可边类型方法,都是遵从系统规则而已。如果你想实现自己的规则,也是可以的

    50、autoreleasepool AutoreleasePoolPage

    每个AutoreleasePoolPage对象占用4096个字节的内存,除了用来存放它内部的成员变量外,剩下的空间用来存放autorelease对象的地址

    所有的AutoreleasePoolPage对象都是通过双向链表的形式连接在一起

    51、关联对象有什么应用,系统如何管理关联对象?其被释放的时候需要手动将所有的关联对象的指针置空么?

    可以不改变源码的情况下增加实例变量。

    可与分类配合使用,为分类增加属性。(类别是不能添加成员变量的(property本质也是成员变量 = var + setter、getter),原因是因为一个类的内存大小是固定的,一个雷在load方法执行前就已经加载在内存之中,大小已固定)

    AssociationsManager里面是由一个静态AssociationsHashMap来存储所有的关联对象的。这相当于把所有对象的关联对象都存在一个全局map里面。而map的的key是这个对象的指针地址(任意两个不同对象的指针地址一定是不同的),而这个map的value又是另外一个AssociationsHashMap,里面保存了关联对象的kv对。

    52、load和initialize

    当类被引用进项目的时候就会执行load函数(在main函数开始执行之前),与这个类是否被用到无关,

    initialize在类或者其子类的第一个方法被调用前调用。即使类文件被引用进项目,但是没有使用,initialize不会被调用。

    相关文章

      网友评论

        本文标题:1.8、iOS面试题之语法

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