关键字(@property属性)(I)

2019-10-20  本文已影响0人  Harely

nonatomic和atomic

属性声明为atomic时,在该属性在调用getter和setter方法时,会加上同步锁(也叫互斥锁@synchronized)。
即在属性在调用getter和setter方法时,保证同一时刻只能有一个线程调用属性的读/写方法。保证了读和写的过程是可靠的。
但并不能保证数据一定是可靠的。

理由如下图:


数据不可靠

retain

  retain到另外一个对象之后,地址是不会变化的,地址也为0x1111,实质上是建立一个指针,也就是指针拷贝,内容也是相同的,retain值会加1。

- (void)setName:(NSString *)name{
    if (_name != name) {
        [ _name release];
        _name = [name retain];
    }
}
- (NSString *)name{
    return [[ _name retain] autorelease];
}

copy

  copy建立一个相同的对象,如果一个NSString对象,假如地址为0x1111,内容为@"hello",通过Copy到另一个对象之后,地址为0x2322,内容也相同,而新的对象retain为1,旧的对象是不会发生变化。

内部实现

- (void)setName:(NSString *)name{
    if (_name != name) {
        [ _name release];
        _name = [name copy];
    }
}
- (NSString *)name{
    return [[ _name retain] autorelease];
}

assign

内部实现

- (void)setName:(NSString *)name{
    _name = name;
}


- (NSString *)name{
    return _name;
}

weak

weak 实现原理

野指针,僵尸对象,空指针详解

上一篇下一篇

猜你喜欢

热点阅读