我是另一位初学者,试图了解可可及其复杂性。我正在阅读DeVoe的“Objective-C”。在关键值编码一节中,有一些setValue:forKeyPath:
的例子。不知怎的,试试我可能无法让它发挥作用。
以下是代码:
// Bar.h
// UsingKVC
//
// Created by Stephen Ng on 2/04/12.
// Copyright (c) 2012 Nutek. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Bar : NSObject
{
NSArray *array;
NSString *stringOnBar;
}
@property (retain,nonatomic) NSArray *array;
@property (retain,nonatomic) NSString *stringOnBar;
@end
@interface Foo : NSObject
{
Bar *bar;
NSString *stringOnFoo;
}
@property (retain,nonatomic) Bar *bar;
@property (retain,nonatomic) NSString *stringOnFoo;
@end
//
// Bar.m
// UsingKVC
//
// Created by Stephen Ng on 2/04/12.
// Copyright (c) 2012 Nutek. All rights reserved.
//
#import "Bar.h"
@implementation Bar
@synthesize array;
@synthesize stringOnBar;
@end
@implementation Foo
@synthesize bar;
@synthesize stringOnFoo;
@end
//
// main.m
// UsingKVC
//
// Created by Stephen Ng on 2/04/12.
// Copyright (c) 2012 Nutek. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Bar.h"
int main (int argc, const char * argv[])
{
@autoreleasepool {
Foo *foo = [[Foo alloc] init];
[foo setValue:@"blah blah" forKey:@"stringOnFoo"];
NSString *string = [foo valueForKey:@"stringOnFoo"];
NSLog(@"string: %@", string);
[foo setValue:@"The quick brown fox" forKeyPath:@"bar.stringOnBar"];
NSString *string2 = [foo valueForKeyPath:@"bar.stringOnBar"];
NSLog(@"string2: %@",string2);
}
return 0;
}
string2为NULL!
我不明白这一点。据我所知,使用@property
时,所有代码都符合KVC标准。但似乎关键路径不起作用。
答案 0 :(得分:3)
foo.bar
为nil(您没有为bar
设置值)因此您的KVC访问器将无提示失败或返回nil - 密钥路径消息的值基本上被分解为单独的访问器,并且如果路径上的任何内容不存在,则路径无法完成。
创建一个新的Bar对象并将其分配给foo.bar
,然后您的密钥路径代码将起作用。