属性 及 KVC 的使用

属性:

1. 在类的 .h 文件中声明属性

2. 在类的 .m 文件属性实现

3. 在类的 .m 文件中的@synthesize可以省略了

4. 在类的 .h 文件中的成员变量声明部分可以省略了

属性的三大作用:

1. 声明了成员变量(可见度: 私有的) 

2. 声明了setter和getter方法

3. 实现了setter和getter方法


例子1:

Person类 .h 文件:

#import <Foundation/Foundation.h>

@interface Person : NSObject

@property (nonatomic, retain) NSString *name;
@property (nonatomic, assign) NSInteger age;

@end

在Person类的 .h 文件中进行属性声明

1. 关键字@property

2. 属性没有_

3. 相当于声明了setter和getter方法


Person类 .m 文件:

#import "Person.h"

@implementation Person

- (void)info
{
    NSLog(@"name: %@, age: %lu", _name, _age);
}

@end

在Person类的 .m 文件中进行属性的实现

1. 关键字 @synthesize

2. 相当于实现了setter和getter方法


main 中:

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

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

        Person *per1 = [[Person alloc] init];
        [per1 setName:@"Tom"];
        per1.name = @"Tom";
        per1.age = 10;
        [per1 info];
        NSLog(@"name: %@", [per1 name]);

    }
    return 0;
}

在main 中先引入头文件 #import "Person.h",在创建对象进行调用

打印结果:

name: Tom, age: 10

name: Tom


例子2:

Car类 .h 文件:

#import <Foundation/Foundation.h>

@interface Car : NSObject

{
//    NSString *_name;
}

@property (nonatomic) NSString *name;

- (void)setName:(NSString *)name;

- (NSString *)name;

@end
Car类 .m 文件:

<pre name="code" class="objc">#import "Car.h"

@implementation Car

//          属性    成员变量
@synthesize name = _name;

// 赋值(给成员变量_name赋值)
- (void)setName:(NSString *)name
{
    _name = name;
//    self.name = name;
}

// 取值(获得成员变量的值)
- (NSString *)name
{
    return _name;
}
 1. 如果重写了系统的setter,getter 方法,必须加@synthesize 让成员变量和属性一样  

2. setter getter 都是给成员变量赋值,不是给属性赋值

3. setter方法是为了给成员变量_name赋值,getter方法是获取成员变量的值

4. 不能在setter getter 方法中使用属性只能使用成员变量

5. 在setter方法setName中:

car调用setName这个方法,所以self == car,self.name == car.name

反复调用setName这个方法,递归,进入死循环

main 中:

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

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        Car *car = [[Car alloc] init];
        car.name = @"劳斯莱斯";
        NSLog(@"name = %@", car.name);
        
    }
    return 0;
}
打印结果:

name = 劳斯莱斯


KVC (key - value - coding):

1. 给属性赋值

Car *c = [[Car alloc] init];
[c setValue:@"红旗" forKey:@"name"];
NSLog(@"%@", c.name);

setValue:@"红旗"forKey:@"name" 中的name 与 属性name 相同

打印结果:

红旗


2. 字典 和 model类 的转换

NSMutableDictionary *mDic = [NSMutableDictionary dictionary];
[mDic setObject:@"奔驰" forKey:@"name"];
[mDic setObject:@"1000000" forKey:@"price"];
//        c.name = [mDic objectForKey:@"name"];
[c setValuesForKeysWithDictionary:mDic];
NSLog(@"name = %@", c.name);

在Car这个类中并未声明price这个属性,所以在转换时在Car.m 文件中要进行纠错

Car.m 文件中:
- (void)setValue:(id)value forUndefinedKey:(NSString *)key
{
    
}

重写父类方法

如果没有定义这个属性,那么重写这个方法,里面什么都不写

通过字典给model 赋值,必须在model类里重写这个方法, 空着就可以










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值