常见面试题的概要汇总
代理为什么要用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;
nonatomic atomic区别;atomic是绝对的线程安全吗,如果不是如何实现;
- atomic 保障了get、set方法的完整性;
- atomic 不是绝对的线程安全,set同时其他线程可以get;如果要线程安全可以使用线程锁;
UICollectionView如何实现自定义?
- UICollectionViewLayoutAttributes,UICollectionFlowLayout;
StoryBoard开发界面有什么弊端,如何避免;
- 难以维护,比如全局改动一个字体;
- storyBoard过大的话,加载速度慢;
- 遇到错误,提示不明显;
- 动态修改属性通过代码实现;
- 部分可以独立的view 可使用xib;
进程与线程、同步与异步、并行与并发还有穿行;
- 进程是系统内的一个运行的程序,比如一个运行的exe就是一个进程;线程是进程中的一个执行流程;
- 同步是顺序执行,执行完成一个在执行下个任务,需要等待,派发任务时需要任务执行完;
- 异步是彼此任务独立,在等待某事件的过程中继续做自己的事,不需要等待这些事件完成后再工作,派发任务不会立即执行;
- 并发是一个cpu多个任务复用,轮番执行任务,多个任务共享,提高效率;
- 并行是多个cpu同时处理多个任务;
- 穿行就是任务顺序执行;
线程间通信;
GCD中常用函数
- 延迟派发dispatch_after()
- 一次性执行 dispatch_once()
- 栅栏函数 dispatch_barrier_async/dispatch_barrier_sync
- 队列组 dispatch_group
- GCD 定时器 并且更加精确
如何使用队列来避免资源抢夺?
- dispatch_barrier_async,等前面队列完成后再进行操作;
数据持久化方案
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 区别
进程间的通信方式有哪些
- URL Scheme
- Keychain
- UIPasteboard
- UIDocumentInteractionController
- Local socket
- AirDrop
- UIActivityViewController
- App Groups
oc 对象 是结构体还是联合体
多态
- 不同对象以自己的方式响应相同的消息的能力叫做多态。
- OC中通过继承、select名字、参数等可实现;