objective-c kvo

#import <Foundation/Foundation.h>

@interface PlayItem : NSObject{
    NSString *name;
    float price;
}
@property (nonatomic, retain) NSString *name;
@property (nonatomic, assign) float price;
@end


#import "PlayItem.h"

@implementation PlayItem
@synthesize name = _name;
@synthesize price = _price;

- (void)dealloc
{
    self.name = nil;
    [super dealloc];
}

- (void)setValue:(id)value forUndefinedKey:(NSString *)key
{
    NSLog(@"function %@ is calling", NSStringFromSelector(_cmd));
}
@end


#import <Foundation/Foundation.h>
#import "PlayItem.h"
@interface PlayList : NSObject{
    float number;
    NSString *name;
    NSMutableArray *itemlist;
    PlayItem *currItem;
}

@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSMutableArray *itemlist;
@property (nonatomic, retain) PlayItem *currItem;
@property (nonatomic, assign) float number;
@end


#import "PlayList.h"

@implementation PlayList

@synthesize  number = _number, name = _name, currItem = _currItem,
itemlist = _itemlist;

- (id)init
{
    self = [super init];
    if (self){
        self.currItem = [[[PlayItem alloc]init] autorelease];
        self.itemlist = [NSMutableArray array];
        for (int i = 0; i < 20; i ++){
            PlayItem *pi = [[PlayItem alloc]init];
            pi.name = [NSString stringWithFormat:@"name %d", i];
            pi.price = 100 + i;
            [self.itemlist addObject:pi];
            [pi release];
        }
    }
    return self;
}

- (void)dealloc
{
    self.name = nil;
    self.currItem = nil;
    self.itemlist = nil;
    [super dealloc];
}
@end


//测试

        //kvc
        PlayList *pl = [[PlayList alloc]init];
        [pl setValue:@"lan" forKey:@"name"];
        NSLog(@"name is %@", pl.name);
        id v = [pl valueForKey:@"number"];
        NSLog(@"v is %@", v);
        //设置多级
        [pl setValue:@"current " forKeyPath:@"currItem.name"];
        NSLog(@"%@", pl.currItem.name);
        //设置一批
        NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
                              @"200", @"number",
                              @"lan", @"name", nil];
        [pl setValuesForKeysWithDictionary:dict];
        NSLog(@"%@, %f", pl.name, pl.number);
        //取出值
        id obj = [pl valueForKey:@"itemlist"];
        NSLog(@"%@", obj);
        //取出多级
        id obj2 = [pl valueForKeyPath:@"itemlist.name"];
        NSLog(@"%@", obj2);
        
        //使用kvo内置属性fangfa
        NSLog(@"sum %@", [pl.itemlist valueForKeyPath:@"@sum.price"]);
        NSLog(@"avg %@", [pl.itemlist valueForKeyPath:@"@avg.price"]);
        NSLog(@"max %@", [pl.itemlist valueForKeyPath:@"@max.price"]);
        NSLog(@"min %@", [pl.itemlist valueForKeyPath:@"@min.price"]);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在Objective-C中,可以使用mock类来模拟对象的行为和属性。通过使用KVO(键值观察)机制,您可以在不是自己创建的类中使用KVO,也可以只对您想要监听变化的类使用。被观察的对象必须继承自NSObject,并且使用Objective-C类型。被观察的变量必须声明为dynamic。这意味着您必须熟悉要观察的事务。\[1\] 关于Objective-C的mock类,可以参考苹果官方提供的《The Objective-C Programming Language》文档,该文档详细介绍了Objective-C的语法和特性。\[2\] 在Objective-C的类中,除了NSObject类之外,每个类都有一个isa值。super_class的值永远不会为nil,因为Objective-C中的其他类都以某种方式继承自NSObject。\[3\] #### 引用[.reference_title] - *1* *3* [Objective-C 运行时以及 Swift 的动态性](https://blog.csdn.net/weixin_42481708/article/details/117346110)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Objective-C 编程艺术 (Zen and the Art of the Objective-C Craftsmanship 中文翻译)](https://blog.csdn.net/aiqian1239/article/details/102006188)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值