iphone - 是否可以自定义@synthesized 属性?

标签 iphone objective-c properties

我可能只是有点懒惰,但请耐心等待。这是我的情况。我有一个具有两个非原子的保留属性的类。比方说:

@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/

相关文章:

powershell - 在 Powershell 类中的静态方法中引用静态成员

javascript - 如何使用 'prototype' 函数正确编码 javascript 属性和方法?

iphone - 有没有其他方法可以在不越狱的情况下查看 iOS 应用程序的大小?

iPhone 应用程序用户界面受到 ON CALL 通知的影响

iphone - 当转到另一个 UITableViewController 时 UITableViewController 卡住

objective-c - ActionScript 到 Objective-C 的转换工具

iphone - 更改 NSDate 对象的年月日

iphone - 在 map 上放置注释

ios - 如何使用 Gimbal Manager 门户让推送通知适用于 ios?我已经完成了文档中的所有必要步骤。仍然没有运气

objective-c - GUI 元素对属性的变化没有反应