首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >值发生变化时不触发KVO

值发生变化时不触发KVO
EN

Stack Overflow用户
提问于 2012-09-13 22:45:32
回答 2查看 3.8K关注 0票数 3

我正在尝试用Apple的KVC做一些测试,但由于某些原因,当我通过KVC更改一个值时,我不能让KVO触发。

我有以下代码:

代码语言:javascript
复制
#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:。

有什么帮助吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-13 22:48:29

你将你的观察者添加到一个还不存在的对象中。

代码语言:javascript
复制
Character *sakura;

这只是声明了变量,但并没有实际分配或初始化它。

在注册为观察者之前,请尝试调用sakura = [[Character alloc] init];

顺便说一句,NSString属性通常使用copy标志,而不是retain。在原始类型(NSInteger)的情况下,内存管理标志(assign)没有意义。

票数 3
EN

Stack Overflow用户

发布于 2012-09-13 22:50:37

代码语言:javascript
复制
[sakura addObserver:sakura forKeyPath:@"ownedClowCards" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];

在初始化sakura之前,您正在执行上述操作。当然,将nil设置为观察nil的更改不会起到任何作用。

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

https://stackoverflow.com/questions/12408923

复制
相关文章

相似问题

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