面试问题

来源:互联网 发布:智云软件开发 编辑:程序博客网 时间:2024/06/07 08:58

1.委托是什么?委托和委托方双方的property声明用什么属性?为什么?
委托:一个对象保存另外一个对象的引用,被引用的对象实现了事先确定的协议,该协议用于将引用对象中的变化通知给被引用对象。

委托和委托方双方的property声明属性都是assign而不是retain

为了避免循环引用造成的内存泄露。

2.循环引用问题
比如在main函数中创建了两个类的对象A和B,现在引用计数都是1。现在让A和B互相引用(A有一个属性是B对象,属性说明是retain;B有一个属性是A对象,属性说明是retain),现在两个对象的引用计数都增加了1,都变成了2。

现在执行[A release]; [B release]; 此时创建对象的main函数已经释放了自己对对象的所有权,但是此时A和B的引用计数都还是1,因为他们互相引用了。

这时你发现A和B将无法释放,因为要想释放A必须先释放B,在B的dealloc方法中再释放A。同理,要想释放B必须先释放A,在A的dealloc方法中再释放B。所以这两个对象将一直存在在内存中而不释放。这就是所谓的循环引用的问题。要想解决这个问题,一般的方法可以将引用的属性设置为assign,而不是retain来处理。

3.内存管理的机制
讲解:iOS仅支持两种内存管理方式,MRC和ARC。我们内存管理主要讲一下MRC。对于MRC,内存管理的机制是:引用计数。一个对象可以被其他对象持有(拥有),被一个对象sss持有,我们认为这个对象的引用计数为1,被两个对象拥有,我们认为这个对象的引用计数为2。以此类推。当某个对象不再持有这个对象,我们认为这个对象的引用计数减少1,当对象的引用计数减少到0的时候,说明没有任何对象持有这个对象了,操作系统就会回收这个对象所占有的内存。

整个内存管理其实都在管理这个引用计数,持有一个对象的时候,需要让被持有的对象引用计数加1,当不再持有这个对象的时候,要让被持有对象的引用计数减1。只有对象引用计数为0,对象占用的内存空间才会被系统回收。如果在程序运行过程中,由于内存管理不到位,导致对象不再使用时引用计数还不为0,会引起内存泄露,累积到一定程度程序会crash。如果引用计数为0之后,还在使用这个被系统回收的内存空间,会产生野指针异常,程序通常立即crash。一个好的程序员,既不能让程序产生内存泄露,也不能让程序产生野指针异常。

简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,readonly,assign,retain,copy,nonatomic 、atomic、strong、weak属性的作用?并区别strong(强引用)、 weak(弱引用)?什么情况使用copy,assign,和retain? 引用计数机制进行内存管理。

dealloc release 因为retain就要销毁 创建就要释放
readwtite : 可读写(设置器和访问器) readonly : 只读(访问器) assign : 只做赋值
retain,copy : 赋值并引用计数加1 copy : 拷贝并引用计数加1 nonatomic : 非原子性 anotamic : 原子性(保证多线程安全)
strong : 打开ARC时才会使用,相当于retain weak : 打开ARC时才会使用,相当于assign, 可以把对应的指针变量置为nil copy : 适用于接受了nscopy 协议的对象类型 assign : 适用于一般类型 retain : 适用于一般对象类型

0 0
原创粉丝点击