原子属性的setter和getter

tom*_*tom 24 properties atomic objective-c getter-setter

什么是自动生成的getter和setter看起来像以下属性值?

... in .h
@interface MyClass : NSObject {
@private
    NSString *_value;
}

@property(retain) NSString *value;

... in .m
@synthesize value = _value;
Run Code Online (Sandbox Code Playgroud)

如果我改变属性怎么办?

@property(retain, readonly) NSString *value;
Run Code Online (Sandbox Code Playgroud)

特别是我对故事的原子部分感兴趣,加上保留,如果可能的话,详细的代码将更清楚地说明幕后发生了什么.

zpa*_*ack 24

它们看起来像:

- (NSString*) value 
{
    @synchronized(self) {
        return [[_value retain] autorelease];
    }
}

- (void) setValue:(NSString*)aValue
{
    @synchronized(self) {
        [aValue retain];
        [_value release];
        _value = aValue;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果将属性更改为只读,则不会生成任何setter.吸气剂将是相同的.

  • 此外 - 这更重要 - 锁不是对象的锁,而是一个仅用于属性的轻量级锁.这意味着另一种方法只能通过同步对象来保证属性的线程安全. (6认同)
  • 使用@synchronized(self)的自定义setter比原子属性的自动合成setter慢几个因素 (5认同)
  • @WKS:您可以使用`objc_getProperty`和`objc_setProperty`http://www.cocoawithlove.com/2009/10/memory-and-thread-safe-custom-property.html (2认同)