您的位置:首页 > 其它

属性 及 KVC 的使用

2015-07-14 20:06 441 查看
属性:

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类里重写这个方法, 空着就可以
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: