🚩 | 问题

OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,readonly,assign,retain,copy,nonatomic 、atomic、strong、weak属性的作用?

📌 | 解答

管理机制:使用了一种叫做引用计数的机制来管理内存中的对象。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 用来修饰一个函数的参数,这个参数会在函数返回的时候被自动释放。

results matching ""

    No results matching ""