zoukankan      html  css  js  c++  java
  • KVC 和 OC字典

    KVC(键值编码)和OC 字典很相似,都是键值存储。但是OC 字典比较灵活,它是一种映射。
     [dict setObject:<#(id)#> forKey:<#(id<NSCopying>)#>]
    int main(int argc, const char * argv[])
    {
        @autoreleasepool
        {
            NSMutableDictionary *dict=[[NSMutableDictionary alloc] init];
            [dict setObject: @"1a23" forKey:[NSNumber numberWithInt:123]];//<span style="font-family: Arial, Helvetica, sans-serif;">[NSNumber numberWithInt:123] 存放在常量区(堆、栈、常量、寄存器、代码区、全局区)</span>
    
        
            NSLog(@"y:%@",[dict objectForKey:[NSNumber numberWithInt:123]]);
        }
        return 0;
    }
    其输出结果是

    2015-01-30 10:40:15.677 Test[12481:303] y:1a23


    KVC则是不需要是字典对象调用,他来自是NSObject的分类。@interface NSObject(NSKeyValueCoding)

    KVC的好处是,加入ClassA中的某个非public成员变量没有设置getter方法或者setter方法。但是作为使用者我们必须要获取或改变这个成员变量时可以使用KVC。但是前提是我们这个key 必须是ClassA的成员变量。否则报错。

    @interface ClassA : NSObject
    {
        @private
        NSNumber* _x;
        
    }
    @property(nonatomic,retain,readonly) NSNumber* x;
    
    @end
    
    #import "ClassA.h"
    
    int main(int argc, const char * argv[])
    {
        @autoreleasepool
        {
            ClassA *a=[[ClassA alloc] init];
            [a setValue:[NSNumber numberWithInt:123] forKey:@"x"];
    <span style="white-space: pre;">	</span>//<span style="font-family: Arial, Helvetica, sans-serif;">[a setValue:[NSNumber numberWithInt:123] forKey:@"y"]; 没有成员变量y,报错</span>
            NSLog(@"x:%@",[a valueForKey:@"x"]);
        }
        return 0;
    }
    输出为

    2015-01-30 11:00:37.687 Test[12583:303] x:123

    可以看出即使是私有成员变量,即使没有setter函数,也是可以设置和改变的。

    KVC可以会优先通过setter和getter函数进行更改。如果没有setter 和getter 函数则直接获取成员变量进行更改。


  • 相关阅读:
    【NOIP2011】观光公交
    【NOIP2014】飞扬的小鸟
    HDU
    [Tyvj 1728]普通平衡树
    【NOIP2012】 疫情控制
    洛谷P1613 跑路
    [HNOI2002]营业额统计
    3486 ( Interviewe )RMQ
    poj2019 二维RMQ裸题
    动态规划专题
  • 原文地址:https://www.cnblogs.com/dengzhuli/p/4415565.html
Copyright © 2011-2022 走看看