OC基础知识 -- 属性

来源:互联网 发布:灵格斯for mac 编辑:程序博客网 时间:2024/05/29 15:56

属性

在类的.h中@interface中书写

@property (属性的属性) NSString *name;

表示定义了某个实例变量的setter和getter方法

属性的属性

读写性属性

readonly: 只读 (系统就不会生成setter方法了)

readwrite: 读写 (系统生成getter和setter方法, 相当于什么都不写)

setter: 设置指定setter方法 默认生成方法名 setter = 名字:

getter: 设置指定getter方法 默认生成方法名getter = 名字

原子性属性

nonatomic: 未对多线程同时访问一个变量进行操作保护

atomic: 对多线程同时访问一个变量进行了操作保护(但消耗了大量系统资源 并且这个资源是不必要浪费的 所以一般使用 nonatomic)

语义性属性

注意: 创建工程时 默认是ARC(auto Reference counting 自动管理内存) 需要先改成MRC 才能采用此属性

1) assign: setter 和 getter 方法的实现是直接赋值的 可以在基本数据类型和对象类型时使用 多用在基本数据类型中

2) retain: setter 和 getter 方法的实现需要进行重写 并且只用在对象类型时

3) copy: 必须遵守NSCopying协议 并且实现其方法

点语法

在设置好getter和setter方法后可以用点语法在main函数中进行调用 对象.属性
Student *stu1 = [[Student alloc] init];

stu1.name = @"long"; NSLog(@"%@",stu1.name);stu1.sex = @"nan";NSLog(@"%@",stu1.sex);stu1.age = 18;NSLog(@"%ld",stu1.age);

KVC

KVC =Key Value Coding 键值编码

键值编码是一种对属性的间接访问方式

   Student *stu2 = [[Student alloc] init];    [stu2 setValue:@"long" forKey:@"name"];    NSLog(@"%@",stu2.name);

传入的Key的查找顺序: _key _isKey key isKey

为了防止传入的key没有属性与之匹配 需要在类的.m中写一个保护方法:

- (void)setValue:(id)value forUndefinedKey:(NSString *)key{     捕获间接访问属性时 填错的key和value}

为了防止value处填入nil值 需要在类的.m写一个保护方法

- (void)setNilValueForKey:(NSString *)key{    捕获value是空的 对应的key}

如果类中有复合实例变量 可用setValue: forKeyPath: 方法

Phone *myphone = [[Phone alloc] init];    Student *stu1 = [[Student alloc] init];    stu1.phone = myphone;    [stu1 setValue:@"myiphone" forKeyPath:@"phone.name"];    NSLog(@"%@",stu1.phone.name);

通过一个字典 去间接赋值 一个对象

 NSDictionary *dic = @{@"name":@"long",@"sex":@"nan",@"age":@18,@"phone":myphone};    [stu1 setValuesForKeysWithDictionary:dic];    NSLog(@"姓名:%@ 性别:%@ 年龄:%ld 手机:%@",stu1.name, stu1.sex, stu1.age, stu1.phone.name);

间接取值

    NSLog(@"%@",[stu1 valueForKey:@"name"]);    [stu1 valueForUndefinedKey:@"name"];
0 0
原创粉丝点击