2020面试题 iOS

目录
1、设计模式是什么? 你知道哪些设计模式,并简要叙述?
2、MVC 和 MVVM 的区别?
3、#import跟 #include 有什么区别,@class呢,#import<> 跟 #import“”有什么区别?
4、frame 和 bounds 有什么不同?
5、Objective-C的类可以多重继承么?没有的话用什么代替?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么?
6、@property 的本质是什么?ivar、getter、setter 是如何生成并添加到这个类中的?
7、@property中有哪些属性关键字以及作用?
8、delegate 和 notification 的区别
9、什么情况使用 weak 关键字,相比 assign 有什么不同?
10、self.跟self->什么区别?
11、用@property声明的 NSString / NSArray / NSDictionary 经常使用 copy 关键字,为什么?如果改用strong关键字,可能造成什么问题?
12、浅拷贝和深拷贝的区别?
13、这个写法会出什么问题:@property (nonatomic, copy) NSMutableArray *arr;?
14、一个objc对象的isa的指针指向什么?有什么作用?
15、Objective-C 如何对内存管理的,说说你的看法和解决方法?
16、iOS UIViewController的完整生命周期?
17、以下代码运行结果如何?
18、Object-C有私有方法吗?私有变量呢?
19、关键字const什么含义?
20、用伪代码写一个线程安全的单例模式
21、category 和 extension 的区别
22、tableView的重用机制?
23、iOS 内存的使用和优化的注意事项?
24、iOS 你在项目中是怎么优化内存的?
25、写一个完整的代理,包括声明、实现
26、iOS 你在项目中用过 GCD 吗?举个例子
27、GCD 与 NSOperation 的区别
28、写出使用GCD方式从子线程回到主线程的方法代码
29、OC中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?
30、你是怎么封装一个view的(有梗和故事)

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:761407670 进群密码123,不管你是小白还是大牛欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!

另附上一份各好友收集的大厂面试题,进群可自行下载!

1、设计模式是什么? 你知道哪些设计模式,并简要叙述?

设计模式是一套被 反复使用、多数人知晓、经过分类编目的、代码设计经验的总结。

单例模式:单例模式确保某一个类只有一个实例,并提供一个访问它的全剧访问点。具体的详情可点击进入查看
工厂模式:工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生产具体的产品对象,即通过不停的工厂子类来创建不同的产品对象。具体的详情可点击进入查看
代理模式 :为某个对象提供一个代理,并由这个代理对象控制对原对象的访问。具体的详情可点击进入查看
适配器模式: 将一个接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式的别名是包装器模式(Wrapper),是一种结构型设计模式。具体的详情可点击进入查看
装饰者模式: 不改变原有对象的前提下,动态地给一个对象增加一些额外的功能。具体的详情可点击进入查看


2、MVC 和 MVVM 的区别?

MVC
MVC(Model-View-Controller)模式结构图,可分为三部分:模型(Model)、视图(View)、控制器(Controller)。其在MVC模式中所扮演的角色分别为:
Model:模型管理应用程序的数据,响应有关其状态信息(通常来自View)的请求,并响应指令以更改状态(通常来自Controller)。
View:视图管理数据的展示。
Controller:控制器解释用户的输入,并通知模型、视图进行状态更新
所有通信都是单向的。
优点:对Controller进行瘦身,将View内部的细节封装起来了,外界不知道View内部的具体实现
缺点:View和Controller依赖于Model

MVVM
MVVM(Model View View-Model)就是为了解决过于臃肿的问题。MVVM的思想是将Controller中UI控制逻辑与业务逻辑进行分离,并抽离出一个View-Model来完成UI控制的逻辑。而Controller只需要负责业务逻辑即可

唯一的区别是,View-Model可以调用Model定义的方法,从Model中获取数据以用于View,并对数据进行预处理,使View可以直接使用。View又可以向View-Model发出用户的操作命令,从而更改Model。MVVM实现了一种双向绑定机制。

优点:降低了View和Model之间的耦合;分离了业务逻辑和视图逻辑。
缺点:View和Model双向绑定导致bug难以定位,两者中的任何一方出现问题,另一方也会出现问题;增加了胶水代码。

3、#import跟 #include 有什么区别,@class呢,#import<> 跟 #import“”有什么区别?

1>. #import是Objective-C导入头文件的关键字,#include是C/C++导入头文件的关键字,使用#import头文件会自动只导入一次,不会重复导入。
2>.@class告诉编译器某个类的声明,当执行时,才去查看类的实现文件,可以解决头文件的相互包含。
3>. #import<>用来包含系统的头文件#import””用来包含用户头文件。


4、frame 和 bounds 有什么不同?

frame:该view在父view坐标系统中的位置和大小。(参照点是父view的坐标系统)

bounds:该view在本身坐标系统中的位置和大小。(参照点是本身坐标系统)


5、Objective-C的类可以多重继承么?没有的话用什么代替?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么?

OC不可以多继承,OC是单继承。有时可以用分类和协议来代替多继承
可以实现多个接口(协议)
Category是类别;一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系。


6、@property 的本质是什么?ivar、getter、setter 是如何生成并添加到这个类中的?

@property 的本质是:@property = ivar + getter + setter

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


7、@property中有哪些属性关键字以及作用?

nonatomic :非原子操作。决定编译器生成的setter和getter方法是否是原子操作,一般使用nonatomic,效率高。
atomic:多线程安全,但是性能低
strong:持有特性。setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1。
copy :拷贝特性。setter方法将传入对象复制一份,需要完全一份新的变量时。
assign:用于基本数据类型
readwrite:可读可写特性。需要生成getter方法和setter方法
readonly:只读特性。只会生成getter方法,不会生成setter方法,不希望属性在类外改变。
retain:相当于ARC中的strong


8、delegate 和 notification 的区别

二者都用于传递消息,不同之处主要在于一个是一对一的,另一个是一对多的
notification:不需要两者之间有联系,实现一对多消息的转发
delegate:需要两者之间必须建立联系,不然没法调用代理的方法


9、什么情况使用 weak 关键字,相比 assign 有什么不同?

1>.在 ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用 weak 来解决,比如: delegate 代理属性。
2>.自身已经对它进行一次强引用,没有必要再强引用一次,此时也会使用 weak,自定义 IBOutlet 控件属性一般也使用 weak(因为父控件的subViews数组已经对它有一个强引用)。

不同点:
assign 可以用非 OC 对象,而 weak 必须用于 OC 对象。
weak 表明该属性定义了一种“非拥有关系”。在属性所指的对象销毁时,属性值会自动清空(nil)。


10、self.跟self->什么区别?

1>. self.是调用get方法或者set放
2>. self是当前本身,是一个指向当前对象的指针
3>. self->是直接访问成员变量


11、用@property声明的 NSString / NSArray / NSDictionary 经常使用 copy 关键字,为什么?如果改用strong关键字,可能造成什么问题?

用 @property 声明 NSString、NSArray、NSDictionary 经常使用 copy 关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary,他们之间可能进行赋值操作(就是把可变的赋值给不可变的),为确保对象中的字符串值不会无意间变动,应该在设置新属性值时拷贝一份。

1>. 因为父类指针可以指向子类对象,使用 copy 的目的是为了让本对象的属性不受外界影响,使用 copy 无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本。
2>. 如果我们使用是 strong ,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性。
总结:使用copy的目的是,防止把可变类型的对象赋值给不可变类型的对象时,可变类型对象的值发送变化会无意间篡改不可变类型对象原来的值。


12、浅拷贝和深拷贝的区别?

浅拷贝:对一个对象地址的拷贝。源对象和副本对象是同一对象
深拷贝:对一个对象的拷贝。源对象和副本对象是不同的两个对象


13、这个写法会出什么问题:@property (nonatomic, copy) NSMutableArray *arr;?

问题:添加,删除,修改数组内的元素的时候,程序会因为找不到对应的方法而崩溃。

 

作者:wwpeter
推荐阅读:备战2020——iOS全新面试题总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值