1、简述OC中的内存管理机制?与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,readonly,assign,retain,copy,nonatomic,atomic,strong,weak属性的作用?
答:(1)a、对你自己拥有的对象负责,你只能释放你所拥有的对象。b、凡是你通过retain 、alloc、copy等手段获得了所有权的对象,都必须在你不使用它的时候,由你来release、autorelease等手段来释放你对其所有权。c、在一段代码中alloc、retain、copy的操作次数应与release、autorelease的操作次数相等。
(2)、与retain配对使用的release retain使引用计数+1,release使引用计数-1
(3)、与alloc配对使用的dealloc, alloc 开辟内存,dealloc销毁内存空间 当引用计数为0时,dealloc销毁空间(回收内存)
(4)、readwrite 可读写 生成getter、setter方法 readonly 只读 只生成getter方法 这两个属性他们的真正价值,不是提供成员变量访问接口,而是控制成员变量的访问权限。
assign适用于 基础数据类型和C数据类型 引用计数不+1 直接赋值 (例如:int、 float 、 delegate等)
retain 对其他NSObject和其他子类 引用计数+1
copy 对于Copy属性有一点要主要,被定义有copy属性的对象必须要符合NSCopying协议,并且你还必须实现了-(id)copyWithZone:(NSZone*)zone该方法。对于可变对象为深拷贝(原对象引用计数不+1,是复制了一个新对象,其内存地址改变,新对象引用计数从0到1),对于不可变对象为浅拷贝(引用计数+1,是复制了该对象的内存地址)
nonatomic 非原子性的,不保证多线程下安全 natomic原子性,保证多线程下安全
Strong 、weak用于非ARC模式下,
Strong表明对象属于强引用类似于retain,但是比retain安全,只要对象存在拥有者,就可以引用不会被释放,只要对象失去了拥有者,立即被抛弃
weak型的指针变量仍然可以指向一个对象,但不属于对象的拥有者
1.执行下面的代码
__weak NSString *name = self.nameField.text;
name变量和nameField.text属性都指向同一个NSString对象,但name不是拥有者
2.如果文本框的内容发生变化,则原先的NSString对象就没有拥有者,会被释放,此时name变量会自动变成nil,称为空指针
weak型的指针变量自动变为nil是非常方便的,这样阻止了weak指针继续指向已释放对象,避免了野指针的产生,不然会导致非常难于寻找的Bug,空指针消除了类似的问题