美文网首页
iOS精选面试题②

iOS精选面试题②

作者: 莫忘小猪 | 来源:发表于2016-07-29 23:19 被阅读0次

    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精选面试题②

          本文链接:https://www.haomeiwen.com/subject/yogzjttx.html