iOS面试题汇总

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

  1. GCD的一些用法, 可以看这里. 点击

你可能感兴趣的:(ios,面试)