iOS 面试题简要汇总

常见面试题的概要汇总

代理为什么要用weak, delegate 和 DataSource 区别,block和delegate区别?

  • 防止循环引用;
  • delegate主要是操作,dataSource主要是提供数据;
  • block方便引用上下文,代码更容易理解,轻量级,容易造成循环引用;delegate架构设计更清晰,用weak修饰不容易造成循环引用,没有block轻量级;

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

  • 属性本质是@property = ivar + get + set,即会自动生成get/set方法;
  • 默认关键字有atomic\nonatomic@synthesize@dynamic\getter=getterName\setter=setterName\readwrite\readonly\assign\retian\copy\strong\weak等;
  • @dynamic,动态实现属性访问方法,需要再NSObject中实现 +(BOOL)resolveInstanceMethod(SEL) sel 方法中指定动态实现的函数或者方法,或者手动实现方法;
  • @Synthesize 自动实现get、set方法;

NSString为什么要用copy,如果用strong会有什么问题?

  • NSString指向NSMUtableString时,如果用copy,则是深copy,strong 则是指向同一个对象,有可变的隐患;
  • 不可变字符串则是一样效果;copy在这种情况下是浅copy;

copy、mutablecopy什么时候是深copy、浅copy,可变对象copy后有什么影响?

  • copy不可变对象浅copy,引用计数+1,copy可变对象深copy;
  • mutablecopy全部是深copy;
  • mutable对象copy后变不可变对象,所以NSMutableString不可用copy修饰;
  • 不可变对象mutablecopy后变为可变对象;
  • 对数组深copy,数组中的对应依然是浅copy;可通过initWithArray:copyItems:或者归档解档实现(对多层嵌套依然有效);

自定义对象如果实现copy、mutablecopy?

  • 实现nscopying和NSMutableCopying协议;

IBOutLet修饰的UIView也适用weak;

  • 因为视图view已经对子视图有强引用了;

nonatomic atomic区别;atomic是绝对的线程安全吗,如果不是如何实现;

  • atomic 保障了get、set方法的完整性;
  • atomic 不是绝对的线程安全,set同时其他线程可以get;如果要线程安全可以使用线程锁;

UICollectionView如何实现自定义?

  • UICollectionViewLayoutAttributes,UICollectionFlowLayout;

StoryBoard开发界面有什么弊端,如何避免;

  • 难以维护,比如全局改动一个字体;
  • storyBoard过大的话,加载速度慢;
  • 遇到错误,提示不明显;
  • 动态修改属性通过代码实现;
  • 部分可以独立的view 可使用xib;

进程与线程、同步与异步、并行与并发还有穿行;

  • 进程是系统内的一个运行的程序,比如一个运行的exe就是一个进程;线程是进程中的一个执行流程;
  • 同步是顺序执行,执行完成一个在执行下个任务,需要等待,派发任务时需要任务执行完;
  • 异步是彼此任务独立,在等待某事件的过程中继续做自己的事,不需要等待这些事件完成后再工作,派发任务不会立即执行;
  • 并发是一个cpu多个任务复用,轮番执行任务,多个任务共享,提高效率;
  • 并行是多个cpu同时处理多个任务;
  • 穿行就是任务顺序执行;

线程间通信;

  • NSThread
  • GCD
  • NSOperation

GCD中常用函数

  • 延迟派发dispatch_after()
  • 一次性执行 dispatch_once()
  • 栅栏函数 dispatch_barrier_async/dispatch_barrier_sync
  • 队列组 dispatch_group
  • GCD 定时器 并且更加精确

如何使用队列来避免资源抢夺?

  • dispatch_barrier_async,等前面队列完成后再进行操作;

数据持久化方案

  • coreData realm fmdb

Appdelegate 方法,第一次启动调用方法,从前台到后台调用方法;

  • 第一次调用的方法是
1
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
  • 前台到后台调用方法
1
2
3
4
5
- (void)applicationWillResignActive:(UIApplication *)application //将要进入后台
- (void)applicationDidEnterBackground:(UIApplication *)application//已经进入后台
- (void)applicationWillEnterForeground:(UIApplication *)application//将要进入前台
 - (void)applicationDidBecomeActive:(UIApplication *)application//已经进入前台
 - (void)applicationWillTerminate:(UIApplication *)application//程序结束

NSCache哪些地方优与NSDictionary

  • 都是类似的key-value存储,不同的是nscache的key不用实现copying协议,value也不用实现coding协议;

知不知道Designated Initializer(指定初始化函数)?使用它的时候有什么需要注意的问题?

1
2
- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil NS_DESIGNATED_INITIALIZER;
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;

description

  • nslog
  • 默认是NSObject的实现,内存地址,类名等;
  • 可以覆盖后输出关键信息,方便调试;

OC使用哪种机制管理内存

  • returnCount机制,每次runloop的时候都要检查对象的returnCount是否小于等于0,则释放;
  • 对比java的引用机制,通过内存回收机制遍历不可达的回收;
  • 引用计数效率更高,但是容易出现循环引用;

block实质,几种block

  • block 结构体,有isa指针指向自己的类(global malloc stack),desc结构体描述bock,_frowording指向自己活着堆上自己的地址,截取上下文的变量,函数指针指向block代码块 -block 编译的时候会生成一个函数,第一参数是block结构体指针,执行block相当于执行block里面_frowding里面的函数

static inline 是什么?

  • tatic inline内联函数:使用它可以减少函数运行时间,提高程序运行速度。但内联函数里不能写循环,开关语句,而且最好不写过于冗长的函数。

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

  • 在声明property时,如果不指定关键字,编译器会为property生成默认的关键字。
  • 对应基本数据类型,默认关键字为atomic,assign,readwrite。
  • 对应对象类型,默认关键字为atomic,strong,readwrite。

为什么在默认情况下无法修改被block捕获的变量?__block都做了什么?

  • 在block中访问的外部变量是复制过去的,写操作不对原变量生效。

模拟一下循环引用的一个情况?block实现界面反向传值该怎么做?

  • 两个.h文件互相import了对方造成循环引用。
  • B反向往A传值,首先在A中声明Block
  • 在B中添加属性,@property (nonatomic,copy) MyBlock block;
  • 在准备接收值的A控制器里实现block,B.block = ^void(NSString *name){_label.text = name;};
  • 谁要传值就在B那里调用self.block(var);。

iOS事件传递响应链是什么?

在我们点击屏幕的时候,iphone OS获取到了用户进行了“单击”这一行为,操作系统把包含这些点击事件的信息包装成UITouch和UIEvent形式的实例,然后找到当前运行的程序,逐级寻找能够响应这个事件的对象,直到没有响应者响应。这一寻找的过程,被称作事件的响应链。不同的响应者以链式方式寻找,AppDelegate->UIApplication->UIWindow->UIViewController->UIView->UIButton

利用kvo数据绑定,在mvvm模式中,数据绑定被用的很广泛,能够动态的根据数据改变刷新UI。

多线程锁

strong weak assign 的区别

类和结构体的区别

多线程锁

strong weak assign 区别

oc 和 swift 混编

mrc 和 arc 混编

http 和 tcp 区别

进程间的通信方式有哪些

  1. URL Scheme
  2. Keychain
  3. UIPasteboard
  4. UIDocumentInteractionController
  5. Local socket
  6. AirDrop
  7. UIActivityViewController
  8. App Groups

oc 对象 是结构体还是联合体

多态

  • 不同对象以自己的方式响应相同的消息的能力叫做多态。
  • OC中通过继承、select名字、参数等可实现;
Built with Hugo     主题 StackJimmy 设计