iOS面试题面试题iOS开发-面试

iOS面试进阶篇(一)

2019-03-12  本文已影响149人  路飞_Luck
目录
  • OC的理解与特性
  • OC内存管理机制
  • MVC与MVVM设计模型对比
  • 垃圾回收机制
  • 协议,分类,KVC,KVO,代理,通知,Block相关试题
  • static,self,super,#include,#import,@class,@public、@protected、@private等关键词
  • CoreData相关
  • 自动释放池
  • 堆和栈的区别
1 OC的理解与特性
2 简述内存管理基本原则

其他注意事项

  1. 如果一个对象有一个_strong类型的指针指向着,找个对象就不会被释放。如果一个指针指向超出了它的作用域,就会被指向nil。如果一个指针被指向nil,那么它原来指向的对象就被释放了。当一个视图控制器被释放时,它内部的全局指针会被指向nil。用法“:不管全局变量还是局部变量用_strong描述就行。
  2. 局部变量:出了作用域,指针会被置为nil。
  3. 方法内部创建对象,外部使用需要添加_autorelease;
  4. 连线的时候,用_weak描述。
  5. 代理使用unsafe_unretained就相当于assign
  6. block中为了避免循环引用问题,使用_weak描述;
  7. 声明属性时,不要以new开头。如果非要以new开头命名属性的名字,需要自己定制get方法名,如
@property(getter=theString) NSString * newString;
  1. 如果要使用自动释放池,用@autoreleasepool{}
  2. ARC只能管理Foundation框架的变量,如果程序中把Foundation中的变量强制换成COreFoundation中的变量需要交换管理权;
  3. 在非ARC工程中采用ARC去编译某些类:-fobjc-arc
  4. 在ARC下的工程采用非ARC去编译某些类:-fno-fobjc-arc
3 如何理解MVC设计模式

MVC是一种架构模式,M表示MOdel,V表示视图View,C表示控制器Controller:

4 如何理解MVVM设计模式
5 Objective-C 中是否支持垃圾回收机制?
6 协议的基本概念和协议中方法默认为什么类型。
7 简述类目category优点和缺点。
8 类别的作用
+ (NSIndexPath *)indexPathForRow:(NSInteger)row inSection:(NSInteger)section

原本属于NSIndexPath的方法,但因为这个方法经常使用的表的时候调用、跟表的关系特别密切,因此把这个方法一类别的形式、声明在UITableView.h中。

9 循环引用的产生原因,以及解决方法。

产生原因:如下图所示,对象A和对象B相互引用了对方作为自己的成员变量,只有自己销毁的时候才能将成员变量的引用计数减1。对象A的销毁依赖于对象B的销毁,同时对象B销毁也依赖与对象A的销毁,从而形成循环引用,此时,即使外界没有任何指针访问它,它也无法释放。

image.png

解决方法:

10 键路径(keyPath)、键值编码(KVC)和键值观察(KVO)

键路径

键值编码KVC

键值观察KVO

KVC机制通过key找到value的原理

11 在 Objective-C 中如何实现 KVO
- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context;
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change   context:(void *)context;
- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath;

KVO中谁要监听谁注册,然后对响应进行处理,使得观察者与被观察者完全解耦。KVO只检测类中的属性,并且属性名都是通过NSString来查找,编译器不会检错和补全,全部取决于自己。

12 代理的作用
13 NSNotification、Block、Delegate和KVO的区别。
14 Objective-C中可修改和不可以修改类型
15 当我们调用一个静态方法时,需要对对象进行 release 吗?

不需要,静态方法(类方法)创建一个对象时,对象已被放入自动释放池。在自动释放池被释放时,很有可能被销毁。

16 当我们释放我们的对象时,为什么需要调用[super dealloc]方法,它的位置又是如何的呢?

因为子类的某些实例是继承自父类的,因此需要调用[super dealloc]方法, 来释放父类拥有的实例,其实也就是子类本身的。一般来说我们优先释放子类拥 有的实例,最后释放父类所拥有的实例。

17 对谓词的认识

Cocoa 中提供了一个NSPredicate的类,该类主要用于指定过滤器的条件, 每一个对象通过谓词进行筛选,判断条件是否匹配。如果需要了解使用方法,请看谓词的具体使用

18 static、self、super关键字的作用
19 #include与#import的区别,#import 与@class 的区别
20 @public、@protected、@private 它们的含义与作用
21 解释 id 类型

任意类型对象,程序运行时才决定对象的类型。

22 switch 语句 if 语句区别与联系
23 isMemberOfClass 和 isKindOfClass 联系与区别
24 iOS 开发中数据持久性有哪几种?

数据存储的核心都是写文件。

25 CoreData

CoreData的介绍:

CoreData的特征:

Core Data的6成员对象

Core Data的功能

26 对象可以被copy的条件
- (id)copyWithZone:(NSZone *)zone;
27 自动释放池工作原理
28 在某个方法中 self.name = _name,name = _name 它 们有区别吗,为什么?
29 解释self = [super init]方法

容错处理,当父类初始化失败,会返回一个nil,表示初始化失败。由于继承的关系,子类是需要拥有父类的实例和行为,因此,我们必须先初始化父类,然后再初始化子类

30 定义属性时,什么时候用 assign、retain、copy 以及它们的之间的区别。
31 堆和栈的区别

iOS面试进阶篇(二)


更多同类型文章敬请期待中

上一篇下一篇

猜你喜欢

热点阅读