在Objective-C中扩展使用@synthesize生成的属性

时间:2009-03-28 17:59:33

标签: objective-c

假设我有一个像这样声明的@property:

@property (readwrite,retain) NSObject *someObject;

我合成它:

@synthesize someObject = _someObject;

这为我生成了getter / setter。此外,根据文档,setter将内置线程安全代码。

现在,假设我想在setSomeObject:方法中添加一些代码。有什么方法可以扩展现有的@synthesize吗?我希望能够重用它自动生成的线程安全代码。

2 个答案:

答案 0 :(得分:3)

您可以定义合成的“私有”属性(将其放在.m文件中)

@interface ClassName ()

// Declared properties in order to use compiler-generated getters and setters
@property (nonatomic, strong <or whatever>) NSObject *privateSomeObject;

@end

然后在ClassName.h@implementation部分)的“公开”部分手动定义一个getter和setter,就像这样,

- (void) setSomeObject:(NSObject *)someObject {
  self.privateSomeObject = someObject;
  // ... Additional custom code ...
}

- (NSArray *) someObject {
  return self.privateSomeObject;
}

您现在可以照常访问someObject“属性”,例如object.someObject。您还可以获得自动生成retain / release / copy的优势,与ARC的兼容性,几乎不会失去线程安全性。

答案 1 :(得分:1)

@synthesize的作用相当于:

-(void)setSomeObject:(NSObject *)anObject {
    [anObject retain];
    [someObject release];
    someObject = anObject;
}

-(void)setSomeObject:(NSObject *)anObject {
    if(someObject != anObject) {
        [someObject release];
        someObject = [anObject retain];
    }
}

因此您可以使用此代码并扩展该方法。

但是,正如您所说,此代码可能不是线程安全的。

对于线程安全,您可能需要查看NSLock@synchronized(感谢unwesen指出这一点。)