我正在尝试用Apple的KVC做一些测试,但由于某些原因,当我通过KVC更改一个值时,我不能让KVO触发。
我有以下代码:
#import <Foundation/Foundation.h>
@interface Character : NSObject
{
NSString *characterName;
NSInteger ownedClowCards;
}
@property (nonatomic, retain) NSString *characterName;
@property (nonatomic, assign) NSInteger ownedClowCards;
-(void)hasLostClowCard;
-(void)hasGainedClowCard;
@end
@implementation Character
@synthesize characterName;
@synthesize ownedClowCards;
-(void)hasLostClowCard
{
}
-(void)hasGainedClowCard
{
}
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"Change");
}
@end
int main()
{
Character *sakura;
Character *shaoran;
//---------------------------------------------------------------------
// Here begins the KVO section.
[sakura addObserver:sakura forKeyPath:@"ownedClowCards" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
//Create and give the properties some values with KVC...
sakura = [[Character alloc] init];
[sakura setValue:@"Sakura Kinomoto" forKey:@"characterName"];
[sakura setValue:[NSNumber numberWithInt:20] forKey:@"ownedClowCards"];
shaoran = [[Character alloc] init];
[shaoran setValue:@"Li Shaoran" forKey:@"characterName"];
[shaoran setValue:[NSNumber numberWithInt:21] forKey:@"ownedClowCards"];
//Done! Now we are going to fetch the values using KVC.
NSString *mainCharacter = [sakura valueForKey:@"characterName"];
NSNumber *mainCharCards = [sakura valueForKey:@"ownedClowCards"];
NSString *rival = [shaoran valueForKey:@"characterName"];
NSNumber *rivalCards = [shaoran valueForKey:@"ownedClowCards"];
NSLog(@"%@ has %d Clow Cards", mainCharacter, [mainCharCards intValue]);
NSLog(@"%@ has %d Clow Cards", rival, [rivalCards intValue]);
[sakura setValue:[NSNumber numberWithInt:22] forKey:@"ownedClowCards"];
}就像你能看到的那样,这是非常非常基本的代码,所以我感到羞愧,因为我不能让它工作,不管是什么原因。我想做的所有事情都是在ownedClowCards发生变化时收到通知。我正在注册观察者。当我运行我的程序时,我希望在程序运行完成时看到一次"Changed“消息。但它从来都不会。更改不会打印到我的程序中,所以我假设不会调用observeValueForKeyPath:ofObject:change:context:。
有什么帮助吗?
发布于 2012-09-13 22:48:29
你将你的观察者添加到一个还不存在的对象中。
Character *sakura;这只是声明了变量,但并没有实际分配或初始化它。
在注册为观察者之前,请尝试调用sakura = [[Character alloc] init];。
顺便说一句,NSString属性通常使用copy标志,而不是retain。在原始类型(NSInteger)的情况下,内存管理标志(assign)没有意义。
发布于 2012-09-13 22:50:37
[sakura addObserver:sakura forKeyPath:@"ownedClowCards" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];在初始化sakura之前,您正在执行上述操作。当然,将nil设置为观察nil的更改不会起到任何作用。
https://stackoverflow.com/questions/12408923
复制相似问题