iOS 面试题笔记

1.iOS assign与weak的区别

相同点:两者都是弱引用声明类型;

不同点:weak声明的变量在栈中就会自动清空,赋值为nil; assign声明的变量在栈中可能不会自动赋值为nil,就会造成野指针错误

注意: 在MRC下,使用delegate时使用assign,ARC时用assign需要手动释放,建议用weak更安全。不管是MRC还是ARC,使用assign都需要手动释放。

2.iOS block为什么要用copy

1)、栈区和堆区概念

内存的栈区 : 由编译器自动分配释放, 存放函数的参数值, 局部变量的值等. 其操作方式类似于数据结构中的栈.

内存的堆区 : 一般由程序员分配释放, 若程序员不释放, 程序结束时可能由OS回收. 注意它与数据结构中的堆是两回事, 分配方式倒是类似于链表.

2)、block用copy作用域

首先, block是一个对象, 所以block理论上是可以retain/release的. 但是block在创建的时候它的内存是默认是分配在栈(stack)上, 而不是堆(heap)上的. 所以它的作用域仅限创建时候的当前上下文(函数, 方法...), 当你在该作用域外调用该block时, 程序就会崩溃.

官方文档:

注意:

1.一般情况下你不需要自行调用copy或者retain一个block. 只有当你需要在block定义域以外的地方使用时才需要copy. Copy将block从内存栈区移到堆区.
2.其实block使用copy是MRC留下来的也算是一个传统吧, 在MRC下, 如上述, 在方法中的block创建在栈区, 使用copy就能把他放到堆区, 这样在作用域外调用该block程序就不会崩溃.
3.但在ARC下, 使用copy与strong其实都一样, 因为block的retain就是用copy来实现的, 所以block使用copy还能装装逼, 说明自己是从MRC下走过来的.

3.__block与__weak的区别

__block:在ARC和MRC下都可用,可修饰对象,也可以修饰基本数据类型。

__block对象可以在block被重新赋值,__weak不可以。

__weak:只在ARC中使用,只能修饰对象,不能修饰基本数据类型(int、bool)。

4.自动释放池什么时候创建,什么时候销毁?

每一次运行循环执行后,也就是每当事件被触发时都会创建自动释放池。在程序执行的过程中,所有autorelease的对象在出了作用域之后会被添加到最近创建的自动释放池中。运行循环结束前会释放自动释放池,还有池子满了也会销毁。

其工作原理是:自动释放池被销毁或耗尽时会向池中的所有对象发送release消息,释放所有autorelease对象。

/* 问题:(1)以下代码是否存在问题?(2)如果有,怎么修改?

网上的解决办法:

1)@autoreleasepool 放在外面,保证循环之后释放循环中的自动释放对象,适用于创建对象次数不太大的循环。

2)@autoreleasepool 放在内部,每一次循环之后,都倾倒一次自动释放池,内存管理是最好的,但是性能不好!适用于创建对象次数很大的循环。

*/

for (int i = 0; i < largeNumber; i++) {

    @autoreleasepool {
        NSString *str = [NSString stringWithFormat:@"Hello "];
        str = [str uppercaseString];
        str = [str stringByAppendingString:@" - World"];
    }

}

5.kvo的实现

答:当你观察一个对象时,一个新的类会被动态创建。这个类继承自该对象的原本的类,并重写了被观察属性的 setter 方法。重写的 setter 方法会负责在调用原 setter 方法之前和之后,通知所有观察对象:值的更改。最后通过 isa 混写(isa-swizzling) 把这个对象的 isa 指针 ( isa 指针告诉 Runtime 系统这个对象的类是什么 ) 指向这个新创建的子类,对象就神奇的变成了新创建的子类的实例。键值观察通知依赖于 NSObject 的两个方法: willChangeValueForKey: 和 didChangevlueForKey: 。在一个被观察属性发生改变之前, willChangeValueForKey: 一定会被调用,这就 会记录旧的值。而当改变发生后, didChangeValueForKey: 会被调用,继而 observeValueForKey:ofObject:change:context: 也会被调用

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