调用属性设置器时,响应数据更改的最佳方式是什么。例如,如果我有一个名为data的属性,我如何在调用[object setData:newData]时做出反应,并且仍然使用合成的setter。本能地,我会像这样覆盖合成的setter:
- (void)setData:(DataObject *)newData {
// defer to synthesised setter
[super setData:newData];
// react to new data
...
}当然,这没有任何意义--我不能这样使用super。那么,处理这种情况的最佳方法是什么呢?我应该使用KVO吗?还是别的什么?
发布于 2011-01-17 15:15:07
有几种不同的方法可以做到这一点,这取决于你想要多大程度的控制。一种方法是观察你自己的属性:
[self addObserver:self forKeyPath:@"data" options:0 context:nil];
- (void)observeValueForKeyPath:(NSString *)path ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if(object == self && [path isEqualToString:@"data"]) {
//handle change here
} else [super observeValueForKeyPath:path ofObject:object change:change context:context];
}确保在dealloc或finalize方法中删除自己作为观察者。
另一种方法是覆盖-didChangeValueForKey:。但是,如果对象上没有观察者,则不能调用此方法。
- (void)didChangeValueForKey:(NSString *)key {
[super didChangeValueForKey:key];
if([key isEqualToString:@"data"]) {
//handle change here
}
}发布于 2011-01-17 13:54:48
@synthesize创建默认的访问器以便于使用。如果需要一些特殊的操作,那么总是可以编写自己的访问器,而不是使用@synthesize。setter和getter不是从基类继承的,它们是由@synthesize指令创建的。所以你不需要(你也不能)调用超级setData:(除非你真的创建了支持它的超类)。
只需确保正确地管理内存即可。Memory Management Programming Guide包含有关如何为不同类型的内存策略(保留、分配或复制)管理内存的示例。
发布于 2012-07-03 05:27:33
您可以定义一个合成的“私有”属性(将其放入.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兼容的优势,并且几乎不会损失线程安全性。
https://stackoverflow.com/questions/4710340
复制相似问题