首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >响应setters

响应setters
EN

Stack Overflow用户
提问于 2011-01-17 13:47:16
回答 3查看 672关注 0票数 4

调用属性设置器时,响应数据更改的最佳方式是什么。例如,如果我有一个名为data的属性,我如何在调用[object setData:newData]时做出反应,并且仍然使用合成的setter。本能地,我会像这样覆盖合成的setter:

代码语言:javascript
复制
- (void)setData:(DataObject *)newData {
    // defer to synthesised setter
    [super setData:newData];

    // react to new data
    ...
}

当然,这没有任何意义--我不能这样使用super。那么,处理这种情况的最佳方法是什么呢?我应该使用KVO吗?还是别的什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-17 15:15:07

有几种不同的方法可以做到这一点,这取决于你想要多大程度的控制。一种方法是观察你自己的属性:

代码语言:javascript
复制
[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:。但是,如果对象上没有观察者,则不能调用此方法。

代码语言:javascript
复制
- (void)didChangeValueForKey:(NSString *)key {
    [super didChangeValueForKey:key];
    if([key isEqualToString:@"data"]) {
        //handle change here
    }
}
票数 4
EN

Stack Overflow用户

发布于 2011-01-17 13:54:48

@synthesize创建默认的访问器以便于使用。如果需要一些特殊的操作,那么总是可以编写自己的访问器,而不是使用@synthesize。setter和getter不是从基类继承的,它们是由@synthesize指令创建的。所以你不需要(你也不能)调用超级setData:(除非你真的创建了支持它的超类)。

只需确保正确地管理内存即可。Memory Management Programming Guide包含有关如何为不同类型的内存策略(保留、分配或复制)管理内存的示例。

票数 2
EN

Stack Overflow用户

发布于 2012-07-03 05:27:33

来自this SO answer

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

代码语言:javascript
复制
@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,如下所示:

代码语言:javascript
复制
- (void) setSomeObject:(NSObject *)someObject {
  self.privateSomeObject = someObject;
  // ... Additional custom code ...
}

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4710340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档