gpt4 book ai didi

objective-c - 如果我写一个自定义属性的getter方法,如果getter通过访问另一个对象的值返回一个值,KVO是否仍然运行?

转载 作者:可可西里 更新时间:2023-11-01 03:47:54 26 4
gpt4 key购买 nike

假设我有一个带有只读属性的类。

//MyClass.h
@interface MyClass

@property (readonly) NSInteger MonitorMe;

@end

现在,我们假设此属性的目的是监视另一个对象内另一个属性的变化,并且当该属性被“观察到”时,它会通过检查另一个外部对象的值来返回派生值。

//MyClass.m
@implementation

@synthesize MonitorMe;
-(NSInteger) getMonitorMe
{
return globalStaticClass.OtherNSInteger;
}

... Inits and Methods ...
@end

现在,假设我在某些地方创建了 MyClass 对象的实例,并且我想在 MonitorMe 属性上添加一个 KVO 观察器。

//AnotherClass.m
@implementation AnotherClass.m

@synthesize instanceOfMyClass;

-(id)init
{
...
instanceOfMyMethod = [MyClass init];
[MyClass addObserver: self
forKeyPath: @"MonitorMe"
options: NSKeyValuObservingOptionNew
context: nil];
...
}

我的问题是,由于MonitorMe属性只监听外部对象中值的变化,当globalStaticClass.OtherNSInteger的值发生变化时,observer方法会执行吗?另外,如果答案是肯定的,这是怎么做到的?

如果这可行,对我来说它就像编译器巫术。

注意

我不认为这有什么不同,但我正在使用 ARC 进行此实现,并且正在为 iOS 设备进行编译。对于此类问题,我怀疑 OS X 和 iOS 之间存在编译差异,但如果这很重要,我有一个 iOS 项目需要上述实现。

此外,上面概述的示例是我实际需要的非常基本的设置。有人可能会争辩说,我可以/应该向 globalStaticClass.OtherNSInteger 值添加一个观察值,而不是只读属性 MonitorMe。在我的实际情况下,这个答案是不够的,因为我的只读属性比我的示例复杂得多。

最佳答案

will the observer method execute when the value of globalStaticClass.OtherNSInteger changes?

不,但是您可以通过+keyPathsForValuesAffectingMonitorMe(或更通用的+keyPathsForValuesAffectingValueForKey:,如果“globalStaticClass”实际上是 MyClass 的属性。请参阅 KVO 指南中的 "Registering Dependent Keys"

这是一个快速模型:

#import <Foundation/Foundation.h>

@interface Monitored : NSObject
@property NSInteger otherInteger;
@end

@implementation Monitored
@synthesize otherInteger;
@end

@interface Container : NSObject
@property (readonly) NSInteger monitorMe;
@property (strong) Monitored * theMonitored;

- (void)changeMonitoredInteger;
@end

@implementation Container

@synthesize theMonitored;

+ (NSSet *)keyPathsForValuesAffectingMonitorMe {

return [NSSet setWithObject:@"theMonitored.otherInteger"];
}

- (id) init {

self = [super init];
if( !self ) return nil;

theMonitored = [[Monitored alloc] init];
[theMonitored setOtherInteger:25];

return self;
}

- (NSInteger)monitorMe
{
return [[self theMonitored] otherInteger];
}

- (void)changeMonitoredInteger {

[[self theMonitored] setOtherInteger:arc4random()];
}

@end

@interface Observer : NSObject
@end

@implementation Observer

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

NSLog(@"Observing change in: %@ %@", keyPath, object);
}

@end

int main(int argc, const char * argv[])
{

@autoreleasepool {

Observer * o = [[Observer alloc] init];
Container * c = [[Container alloc] init];

[c addObserver:o
forKeyPath:@"monitorMe"
options:NSKeyValueObservingOptionNew
context:NULL];

[c changeMonitoredInteger];
[c changeMonitoredInteger];

}
return 0;
}

附言Cocoa 风格注意事项:属性/变量的首字母应为小写,并且(由于 ARC,这实际上现在更重要)不要命名访问器方法以“get”开头——这在 Cocoa 中具有特定含义,涉及传递缓冲并通过引用取回数据。

关于objective-c - 如果我写一个自定义属性的getter方法,如果getter通过访问另一个对象的值返回一个值,KVO是否仍然运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10455272/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com