键值编码KVC

来源:互联网 发布:js中split的用法 编辑:程序博客网 时间:2024/05/21 15:40

KVC编码由NSKeyValueCoding协议提供,

有两个方法:

【1】 为指定的属性设置值: setValue:属性值 forKey:属性名

该方法的底层执行机制:

(1)程序优先考虑setter方法实现属性赋值。

(2)如果程序中不存在该方法,则KVC机制将会搜索类名_****(如:_name)类型的成员变量,无论该变量在什么位置,KVC底层的代码实际上都是为它赋值。

(3)如果以上两种情况都没有,那么底层代码就会直接对成员变量赋值,(如:name);

(4)如果以上情况都不满足,则会执行对象的setValue:forUndefinedKey:方法,引发异常调用。


如果属性名不存在,则会报错,程序引发“NSUnknownKeyException”异常,会是程序异常结束,如果不想使程序结束,可以重写setVal:forUndefinedKey:方法。



【2】获取指定属性的值:valueForKey:属性名

该方法的底层执行机制:

与上述方法的属性获取类似。

注意:引发该对象的异常调用方法是:valueforUndefinedKey:方法。

 简单测试:

FKUser.h

#import <Foundation/Foundation.h>


@interface FKUser : NSObject
{
    NSString* name;
    NSString* pass;
    NSString* birth;
}
@property (nonatomic,copy)NSString* name;
@property (nonatomic,copy)NSString* pass;
@property (nonatomic,copy)NSString* birth;

@end

FKUser.m

#import "FKUser.h"


@implementation FKUser
@synthesize name;
@synthesize pass;
@synthesize birth;


@end


main.m

#import <Foundation/Foundation.h>
#import "FKUser.h"


int main (int argc, const char * argv[])
{


    @autoreleasepool {
        
        // insert code here...
        NSLog(@"Hello, World!");
        
        FKUser* user = [[FKUser alloc] init];
        
        [user setValue:@"nanyang " forKey:@"name"];
        [user setValue:@"1234" forKey:@"pass"];
        [user setValue:@"12-09" forKey:@"birth"];
        
        NSLog(@"name is %@ ",[user valueForKey:@"name"]);
        NSLog(@"pass is %@ ",[user valueForKey:@"pass"]);
        NSLog(@"birth is %@ ",[user valueForKey:@"birth"]);
        
    }
    return 0;
}



0 0
原创粉丝点击