假设我有一个像这样声明的@property:
@property (readwrite,retain) NSObject *someObject;
我合成它:
@synthesize someObject = _someObject;
这为我生成了getter / setter。此外,根据文档,setter将内置线程安全代码。
现在,假设我想在setSomeObject:方法中添加一些代码。有什么方法可以扩展现有的@synthesize吗?我希望能够重用它自动生成的线程安全代码。
答案 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];
}
}
因此您可以使用此代码并扩展该方法。
但是,正如您所说,此代码可能不是线程安全的。