zoukankan      html  css  js  c++  java
  • object-c之kvc kvo(人中有属性数组、Book对象,数组中装载Book对象)

    KVC(KeyValueCoding) “键-值-编码”是一种可以直接通过字符串的名字(key)来访问类实例变量的机制。
    KVC可以用来访问和设置实例变量的值。
    设置方式:[self setValue:aName forKey:@"name"]

         [self setValue:aName forKeyPath:@"person.name"]

    访问方式: aString = [self valueForKey:@"name"]
         aString = [self valueForKeyPath:@"person.name"]

      1 主函数内容
      2         Person *xiaoLi = [[Person alloc]init];
      3         //        Book *book = [[Book alloc]init];
      4         //        [book addMyObserver];
      5         
      6         [xiaoLi setBookName:@"《红楼梦》" andPrice:58];
      7         [xiaoLi setBookName:@"《三国演义》" andPrice:56.5];
      8         [xiaoLi setBookName:@"《水浒传》" andPrice:68.8];
      9         [xiaoLi setBookName:@"《西游记》" andPrice:75.2];
     10         
     11         NSArray *array = [xiaoLi valueForKeyPath:@"bookArray"];
     12         
     13         for (Book *book in array)
     14         {
     15             
     16             NSLog(@"%@ %@",[book valueForKey:@"bookName"],[book valueForKey:@"price"]);
     17         }
     18 
     19 
     20 
     21 #import <Foundation/Foundation.h>
     22 #import "Book.h"
     23 
     24 @interface Person : NSObject
     25 {
     26     NSString *name;
     27     NSMutableArray *bookArray;
     28     Book *aBook;
     29 }
     30 
     31 - (void)setBookName:(NSString *)bookName andPrice:(float)price;
     32 
     33 @end
     34 
     35 
     36 
     37 
     38 #import "Person.h"
     39 #import "Book.h"
     40 
     41 @implementation Person
     42 
     43 - (void)setBookName:(NSString *)bookName andPrice:(float)price
     44 {
     45     // 如果bookArrar没有初始化,初始化
     46     if (!bookArray) {
     47         bookArray = [[NSMutableArray alloc]init];
     48     }
     49     
     50     Book *book = [[Book alloc]init];
     51     
     52     // 开始监听书名的变化
     53     [book addMyObserver];
     54     
     55     [self setValue:book forKey:@"aBook"];
     56     [self setValue:bookName forKeyPath:@"aBook.bookName"];
     57     
     58     // 把price封装成NSNumber数据赋值给bookName,读取bookName时会自动转为float
     59     NSNumber *price1 = [NSNumber numberWithFloat:price];
     60     [self setValue:price1 forKeyPath:@"aBook.price"];
     61     
     62     // 把书装入数组
     63     [bookArray addObject:aBook];
     64 
     65 }
     66 
     67 @end
     68 
     69 
     70 
     71 
     72 #import <Foundation/Foundation.h>
     73 
     74 @interface Book : NSObject
     75 
     76 {
     77     NSString *bookName;
     78     float price;
     79 }
     80 
     81 - (void)addMyObserver;
     82 
     83 @end
     84 
     85 
     86 
     87 
     88 #import "Book.h"
     89 
     90 @implementation Book
     91 
     92 - (void)addMyObserver
     93 {
     94     // 注册监听对象
     95     [self addObserver:self forKeyPath:@"bookName" options:NSKeyValueObservingOptionNew context:nil];
     96     //observer
     97 }
     98 
     99     // 监听属性实例值的变化
    100 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
    101 {
    102     NSLog(@"bookName%@",change);
    103 }
    104 
    105 - (void)dealloc
    106 {
    107     // 移除监听
    108     [self removeObserver:self forKeyPath:@"bookName"];
    109     [super dealloc];
    110 }
    111 
    112 
    113 @end
  • 相关阅读:
    spark 读取mongodb失败,报executor time out 和GC overhead limit exceeded 异常
    在zepplin 使用spark sql 查询mongodb的数据
    Unable to query from Mongodb from Zeppelin using spark
    spark 与zepplin 版本兼容
    kafka 新旧消费者的区别
    kafka 新生产者发送消息流程
    spark ui acl 不生效的问题分析
    python中if __name__ == '__main__': 的解析
    深入C++的new
    NSSplitView
  • 原文地址:https://www.cnblogs.com/doublelongliu/p/4662527.html
Copyright © 2011-2022 走看看