iOS面试题(七)

1、UIView动画与核心动画的区别?

1.核心动画只作用在layer.
2.核心动画修改的值都是假像.它的真实位置没有发生变化.

什么时候用UIView动画什么时候用核心动画?
当需要与用户进行交互时用UIView,不需要与用户进行交互时两个都可以.

什么情况用核心动画最多?
1.转场动画.
2.帧动画.(属性动画的一种,另外一个是基础动画,可以看做是有两个关键帧的帧动画)
3.动画组.

2、weak和assign

weak:用weak修饰,不会让引用计数加一,如果指向的对象被销毁,指针自动置为nil
assign:用unsafe_unretained修饰,不会让引用计数加一,如果指向的对象被销毁,不自动将指针置为nil,会报坏内存访问错误

3、数据库操作知道吗,你使用了哪些第三方的,有什么优势

苹果自带有coreData:CoreData是一个模型层的技术,也是一种持久化技术(数据库),它能将模型对象的状态持久化到磁盘里,其底层也是数据库sqlite的存储。一般用第三方FMDB来自己sqlite的操作,为了保证线程安全,FMDB提供方便快捷的FMDatabaseQueue类FMDatabaseQueue的创建 FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path];简单使用 [queue inDatabase:^(FMDatabase *db) { [db executeUpdate:@”INSERT INTO t_student(name) VALUES (?)”, @”Jack”]; [db executeUpdate:@”INSERT INTO t_student(name) VALUES (?)”, @”Rose”]; [db executeUpdate:@”INSERT INTO t_student(name) VALUES (?)”, @”Jim”];以队列的方法添加操作,保证对数据库的操作不会出错。

4、什么是内存管理机制

所谓内存管理就是所有权机制,对象被拥有的计算量不为0,才得以存在,不然被销毁。alloc:分配内存,引用计算数为1Copy:创造该对象复本,对该副本拥有并计数为1Retain:对持有对象计数+1,当进行setter时会先判断该对象是否与原来一致Release:销毁对象autoRealease:系统自动在未来某个时段计数器-1Strong:ARC引入属性,与retain一样,对对象持有,也就是在自身销毁同时,所持有对象也会销毁,可能会造成死锁。Weak:ARC引入属性,只是引用对象并不将计数加1,前该对象被销毁后指针为空。

5、RAC

iOS面试题(七)_第1张图片

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

1、如果一个方法返回值是一个对象,那么发送给nil的消息将返回0(nil)。
2、如果方法返回值为指针类型,其指针大小为小于或者等于sizeof(void*),float,double,long double 或者 long long 的整型标量,发送给 nil 的消息将返回0。
3、如果方法返回值为结构体,发送给 nil 的消息将返回0。结构体中各个字段的值将都是0。
4.如果方法的返回值不是上述提到的几种情况,那么发送给 nil 的消息的返回值将是未定义的。

7、单元测试、集成测试、系统测试的侧重点是什么?

单元测试是在软件开发过程中要进行的最低级别的测试活动,在单元测试活动中,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。
集成测试,也叫组装测试或联合测试。在单元测试的基础上,将所有模块按照设计要求,组装成为子系统或系统,进行集成测试。实践表明,一些模块虽然能够单独地工作,但并不能保证连接起来也能正常的工作。程序在某些局部反映不出来的问题,在全局上很可能暴露出来,影响功能的实现。
系统测试是将经过测试的子系统装配成一个完整系统来测试。它是检验系统是否确实能提供系统方案说明书中指定功能的有效方法。

8、KVO的底层实现原理是什么?

KVO在添加观察者的时候.会动态生成一个被观察对象的子类类型
然后重写被观察属性的set方法
最后将被观察对象的isa指针修改为子类类型.
当属性修改的时候.KVO就顺利通过子类的set方法观察到属性的变化了

9、IAP内购中虚拟货币导致审核无法通过的问题?

有的时候需要在app中使用虚拟货币,在我们的app中可以使用虚拟货币进行购买道具等,比如直播中的礼物,游戏中的道具等。
苹果对于虚拟货币是需要提成的,提成的额度为30%。所以对于这块的审核比较严格。首先你们的购买的道具在ios端和安卓端是需要分开的。如果大家玩游戏的就会发现游戏的数据在两端是分开的。
用户在安卓手机上购买的道具在ios上不能使用。因为这样也间接的影响了苹果的收入。
另外就是在审核期间不能有可以兑换在appStore可购买的商品,的任意活动或者兑换码,这个也是苹果不允许的。因为这个也会影响苹果的收入。
另外就是可能有人会在苹果审核之后隐藏ipa支付,此处提醒下,苹果会扫描你的app代码中是否有支付宝,微信等关于支付的字段。使用开关加h5的方式可以通过审核,但是此处也有风险,风险就是一旦被发现,可能的结果就是苹果直接封掉账号。app无法使用。

10、如何手动触发一个value的KVO?

所谓的“手动触发”是区别于“自动触发”:
自动触发是指类似这种场景:在注册 KVO 之前设置一个初始值,注册之后,设置一个不一样的值,就可以触发了。
想知道如何手动触发,必须知道自动触发 KVO 的原理:
键值观察通知依赖于 NSObject 的两个方法: willChangeValueForKey: 和 didChangevlueForKey: 。在一个被观察属性发生改变之前, willChangeValueForKey: 一定会被调用,这就 会记录旧的值。而当改变发生后, observeValueForKey:ofObject:change:context: 会被调用,继而 didChangeValueForKey: 也会被调用。如果可以手动实现这些调用,就可以实现“手动触发”了。
那么“手动触发”的使用场景是什么?一般我们只在希望能控制“回调的调用时机”时才会这么做。
具体做法如下:
如果这个 value 是 表示时间的 self.now ,那么代码如下:最后两行代码缺一不可。

//  .m文件
//  手动触发 value 的KVO,最后两行代码缺一不可。
//@property (nonatomic, strong) NSDate *now;
- (void)viewDidLoad {
   [super viewDidLoad];
   _now = [NSDate date];
   [self addObserver:self forKeyPath:@"now" options:NSKeyValueObservingOptionNew context:nil];
   NSLog(@"1");
   [self willChangeValueForKey:@"now"]; // “手动触发self.now的KVO”,必写。
   NSLog(@"2");
   [self didChangeValueForKey:@"now"]; // “手动触发self.now的KVO”,必写。
   NSLog(@"4");
}

但是平时我们一般不会这么干,我们都是等系统去“自动触发”。“自动触发”的实现原理:
比如调用 setNow: 时,系统还会以某种方式在中间插入 wilChangeValueForKey: 、 didChangeValueForKey: 和 observeValueForKeyPath:ofObject:change:context: 的调用。

答案都是收集而来,如果有什么错误,欢迎指正!

你可能感兴趣的:(iOS笔记)