iOS精选面试题②

1、内存中的堆区和栈区的差别

栈区(stack):由编译器自动分配释放,存放方法(函数)的参数值,局部变量的值等

堆区(heap):一般由程序员分配与释放,若程序员不释放,则内存溢出

2、用户自定义了一个对象,如何实现拷贝(可变和不可变拷贝)

必须实现copying和mutableCopying协议,表示返回一个不可变和可变的对象,否则程序将会出现异常。

- (id)copyWithZone:(NSZone *)zone

{

        Person * person =[ [self Class] allocWithZone:zone];

        person ->age = self.age;

        person ->name = self.name;

        return person;

}

- (id)mutableCopyWithZone(NSZone *)zone;

3、定义属性时,什么时候用assign、retain、copy、nonatomic

①assign:普通赋值,一般常用于基本数据类型,常见委托设计模式,以此来防止循环引用。

②retain:保留计数,获得到了对象的所有权。引用计数在原有基础上加1.

③用来复制对象,一般字符串使用copy,Foundation中的不可变对象使用copy效果相当于retain,只是引用计数加1

④nonatomic:非原子性访问,不加同步,多线程并发访问会提高性能。

4、strong与weak,_unsafe_unretained和weak的区别

①strong叫强引用,weak叫弱引用,在ARC中,使用strong告诉编译器帮助我们自动插入retain,weak是普通赋值,相当于手动管理内存的assign

②_unsafe_unretained与weak功能一致,区别在于当指向的对象销毁后,weak会将变量置为nil,防止调用野指针。

5、ARC存在内存泄露吗

ARC中如果内存管理不当的话,同样会存在内存泄露,例如:ARC中也会循环引用导致内存泄露,OC对象CoreFoundation类之间桥接时,管理不当也会产生内存泄露。

6、当我们释放对象时,为什么需要调用[super dealloc]方法

因为,子类是继承自父类,那么子类中有一些实例变量(对象),是继承自父类的,因此,我们需要调用父类方法,将父类所拥有的实例进行释放。

你可能感兴趣的:(iOS精选面试题②)