我可能只是有点懒惰,但请耐心等待。这是我的情况。我有一个具有两个非原子的保留属性的类。比方说:
@property (nonatomic, retain) UITextField *dateField;
@property (nonatomic, retain) NSDate *date;
我在实现中按预期合成了它们。我想要发生的是,每当调用日期 setter 时,它也会对 dateField 执行某些操作(即,它将 dateField 上的文本属性设置为日期的格式良好的版本)。
我意识到我可以通过执行以下操作在我的实现中手动覆盖日期的 setter :
- (void) setDate:(NSDate *)newDate {
if (date != newDate) {
[date release];
date = [newDate retain];
// my code to touch the dateField goes here
}
}
如果我能让 Objective C 处理保留/释放周期,但仍然能够“注册”(因为缺少更好的术语)一个自定义处理程序,它将在保留/释放/设置发生。我猜这是不可能的。不过,我的 google-fu 没有给出任何答案,所以我想问一下。
最佳答案
KVO(键/值观察)在某种程度上可以做到这一点,但它最终会变成更多的代码,并且可能不会更容易阅读或编写。
您可能熟悉 KVO,但如果您(或其他人)不熟悉:在您的 init
函数中,您可以这样做:
[self addObserver:self forKeyPath:@"date" options:0 context:NULL];
然后你会实现这个:
-(void)observeValueForKeyPath:(NSString*)keyPath
ofObject:(id)object
change:(NSDictionary*)change
context:(void*)context
{
if (object == self && [keyPath isEqualToString:@"date"]) {
// code to touch the dateField goes here
}
}
最后,在 dealloc
中,您可以这样做:
[self removeObserver:self forKeyPath:@"date"];
如您所见,代码更多,也更难理解。对于那些以懒惰为目标的人来说并不是很有效 :-) 但 KVO 是 Objective-C 的主要“数据绑定(bind)”功能。有一些平台(例如 Flex)可以用更少的代码进行数据绑定(bind),但在 Objective-C 中需要大量工作。
顺便说一下,没什么大不了的,但是您显示的示例代码有问题——它可能看起来更像这样:
- (void) setDate:(NSDate *)newDate {
if (date != newDate) {
[date release];
date = [newDate retain];
// my code to touch the dateField goes here
}
}
关于iphone - 是否可以自定义@synthesized 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4677266/