gpt4 book ai didi

objective-c - 为什么只读属性仍然允许使用 KVC 写入

转载 作者:太空狗 更新时间:2023-10-30 03:47:07 26 4
gpt4 key购买 nike

我正在学习“Programming for Mac OS X”中的“Key Value Coding”一章。我已经构建了一个带有 slider 和标签的界面,它们都绑定(bind)到 fido,一个 int。如果我将 fido 的属性设置为只读,移动 slider 仍会导致标签更改其值。我原以为我会为此得到某种错误。如果属性是只读的,为什么 slider 仍然可以写入属性?我认为它不会创建 setter,KVC 也不会工作。谢谢。

这是我使用的代码:

#import <Cocoa/Cocoa.h>

@interface AppController : NSObject
{
int fido;
}

@property (readonly, assign) int fido;

@end

#import "AppController.h"

@implementation AppController

@synthesize fido;

- (id)init
{
[super init];
[self setValue:[NSNumber numberWithInt:5] forKey:@"fido"];
NSNumber *n = [self valueForKey:@"fido"];
NSLog(@"fido = %@", n);
return self;
}
@end

alt text http://idisk.me.com/nevan/Public/Pictures/Skitch/Window-20091001-174352.png

最佳答案

AppController.h:

@interface AppController : NSObject
{
int fido;
}

@property (readonly, assign) int fido;
@end

导入“AppController.h”

@implementation AppController
@synthesize fido;
...
@end

此时,您已经声明 AppController 有一个 -fido 方法,并且您已经合成了该方法。没有 -setFido: 方法。那么,为什么以下“有效”?

- (id)init
{
if (self=[super init]) {
[self setValue:[NSNumber numberWithInt:5] forKey:@"fido"];
NSNumber *n = [self valueForKey:@"fido"];
NSLog(@"fido = %@", n);
}
return self;
}

(顺便说一句:我修复了你的 -init 以实现正确的模式)

这是有效的,因为 KVC 遵循启发式来设置或获取值。对 -setValue:forKey: 的调用首先查找 -setFoo:。如果没有找到,它会查找实例变量 foo 并直接设置它。

请注意,如果您将实例变量 fido 更改为 _fido,该集合将起作用,但 valueForKey 将在调用时返回 0合成方法(因为我在 64 位上,@synthesize 合成了一个 fido 实例变量。我知道这很困惑。)

如果您将 ivar 的名称更改为 bar,然后使用 @synthesize foo=bar;,代码将在运行时失败。

你会看到:

2009-10-01 08:59:58.081 dfkjdfkjfjkfd[24099:903] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<AppController 0x20000e700> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key fido.'
*** Call stack at first throw:
(
0 CoreFoundation 0x00007fff85b055a4 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x00007fff85c5a0f3 objc_exception_throw + 45
2 CoreFoundation 0x00007fff85b5caf9 -[NSException raise] + 9
3 Foundation 0x00007fff814e14f5 -[NSObject(NSKeyValueCoding) setValue:forKey:] + 434
(
0 CoreFoundation 0x00007fff85b055a4 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x00007fff85c5a0f3 objc_exception_throw + 45
2 CoreFoundation 0x00007fff85b5caf9 -[NSException raise] + 9
3 Foundation 0x00007fff814e14f5 -[NSObject(NSKeyValueCoding) setValue:forKey:] + 434
4 dfkjdfkjfjkfd 0x0000000100000d96 -[AppController init] + 130

关于objective-c - 为什么只读属性仍然允许使用 KVC 写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1502708/

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