简述OC中内存管理机制

简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,readonly,assign,retain,copy,nonatomic 、atomic、strong、weak属性的作用?并区别strong(强引用)、 weak(弱引用)?什么情况使用copy,assign,和retain?
管理机制:使用了一种叫做引用计数的机制来管理内存中的对象。OC中每个对象都对应着他们自己的引用计数,引用计数可以理解为一个整数计数器,当使用alloc方法创建对象的时候,持有计数会自动设置为1。当你向一个对象发送retain消息 时,持有计数数值会增加1。相反,当你像一个对象发送release消息时,持有计数数值会减小1。当对象的持有计数变为0的时候,对象会释放自己所占用的内存。
retain(引用计数加1)->release(引用计数减1)
alloc(申请内存空间)->dealloc(释放内存空间)
readwrite: 表示既有getter,也有setter (默认)
readonly: 表示只有getter,没有setter
nonatomic:不考虑线程安全
atomic:线程操作安全 (默认)
线程安全情况下的setter和getter:

  • (NSString) value {
    @synchronized(self) {
    return [[_value retain] autorelease];
    }}
    (void) setValue:(NSString
    )aValue {
    @synchronized(self) {
    [aValue retain];
    [_value release];
    _value = aValue;
    } }
    retain: release旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1
    assign: 简单赋值,不更改索引计数 (默认)
    copy: 其实是建立了一个相同的对象,地址不同(retain:指针拷贝 copy:内容拷贝)
    strong:(ARC下的)和(MRC)retain一样 (默认)
    weak:(ARC下的)和(MRC)assign一样, weak当指向的内存释放掉后自动nil化,防止野指针
    unsafe_unretained 声明一个弱应用,但是不会自动nil化,也就是说,如果所指向的内存区域被释放了,这个指针就是一个野指针了。autoreleasing 用来修饰一个函数的参数,这个参数会在函数返回的时候被自动释放。

你可能感兴趣的:(简述OC中内存管理机制)