您的位置:首页 > 职场人生

iOS面试题汇总

2016-04-01 13:57 316 查看

1. NSArray 和 NSMutableArray 的区别(线程方向)?

NSArray是线程安全的, NSMutableArray是线程不安全的, 多线程中使用需要手动加锁 NSLock 或使用 @synchronized 修饰.

2. Autorelease pool 实现原理?

在ARC中使用 @autoreleasepool修饰需要手动添加到释放池的代码.大概意思是autorelease pool 内部为一个双向链表, 每个链表元素为一个页,每个页是一个栈,每个页有一个栈顶指针,指向最新加入的对象,当有对象进入自动释放池的时候,系统会将该对象的地址存入页中并调整栈顶指针.编译器会在自动释放池的作用域前后添加 objc_autoreleasePoolPush 和 objc_autoreleasePoolPop 方法,来标示自动释放池的开始和结束,push方法会在入栈一个哨兵元素,指示一个自动释放池的边界.AutoreleasePool的释放是在当前的runloop迭代结束后才开始的,也就是执行到了pop方法,会对哨兵对象之后的对象发送一次release操作.

详细的实现机制在这里,博主写的很好

3. iOS沙盒机制

Library:存储程序的默认设置或其它状态信息;

Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录

下文件不会在应用退出删除

tmp:提供一个即时创建临时文件的地方。

iTunes在与iPhone同步时,备份所有的Documents和Library文件.

4. 深拷贝和浅拷贝的区别? 官方指南

首先, 被拷贝对象必须实现了NSCopying协议

浅拷贝: 被拷贝在内存中只有一份, 只是增加了一个指针指向这个对

象, 浅拷贝导致该对象引用计数加1.

深拷贝: 为被拷贝对象在内存中复制一份被拷贝着所持有,原来的对象

引用计数不变,拷贝出来的对象引用计数加1.

拷贝方法为 NSCopying协议方法: + (id)copyWithZone:(struct _NSZone )zone 和 + (id)mutableCopyWithZone:(struct _NSZone )zone 具体返回的是深拷贝还是浅拷贝, 需要看代理方法是如何实现的, 不过copy方法返回的始终为不可变对象,mutableCopy方法返回的是可变对象. 另外归档和反归档是真正的深拷贝.

一些拷贝方法的结果对照可以在查看 这里

5. NSTimer 准确吗? 如何调整?

NSTimer 内部会retain调用者, 所以在结束NSTimer后需要调用
[timer invalidate]
来通知timer需要释放, 这样可以避免循环引用而造成内存泄露. NSTimer不是准确的, 他有一些偏差, 因为它的调用是在当前的Runloop中, 如果时间到了调用timer的时候, runloop正在上一个任务中循环执行一个耗时的事件, 这样就失准了.如何来解决呢? 可以使用 mach/mach.h 中的

mach_wait_until:

static const uint64_t NANOS_PER_USEC = 1000ULL;
static const uint64_t NANOS_PER_MILLISEC = 1000ULL * NANOS_PER_USEC;
static const uint64_t NANOS_PER_SEC = 1000ULL * NANOS_PER_MILLISEC;

static mach_timebase_info_data_t timebase_info;

static uint64_t abs_to_nanos(uint64_t abs) {
return abs * timebase_info.numer  / timebase_info.denom;
}

static uint64_t nanos_to_abs(uint64_t nanos) {
return nanos * timebase_info.denom / timebase_info.numer;
}

void example_mach_wait_until()
{
mach_timebase_info(&timebase_info);
uint64_t time_to_wait = nanos_to_abs(10ULL * NANOS_PER_SEC);
uint64_t now = mach_absolute_time();
mach_wait_until(now + time_to_wait);
}


6.GCD队列如何取消?

正常的GCD队列是不支持取消操作的,在stackoverflow上看到过有人说可以将GCD放入NSOperationQueue中来执行取消操作,我没亲自试过,有谁知道请赐教, 另其他GCD的操作可以查看这里.

7.KVO与KVC的含义及区别,KVO键值对观察模式,

8.MVC,MVVM,MVP

GCD的一些用法, 可以看这里. 点击
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios 面试