属性 及 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 文件:
在Person类的 .h 文件中进行属性声明
1. 关键字@property
2. 属性没有_
3. 相当于声明了setter和getter方法
Person类 .m 文件:
在Person类的 .m 文件中进行属性的实现
1. 关键字 @synthesize
2. 相当于实现了setter和getter方法
main 中:
在main 中先引入头文件 #import "Person.h",在创建对象进行调用
打印结果:
name: Tom, age: 10
name: Tom
例子2:
Car类 .h 文件:
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 中:
name =
劳斯莱斯
KVC (key - value - coding):
1. 给属性赋值
setValue:@"红旗"forKey:@"name" 中的name 与 属性name 相同
打印结果:
红旗
2. 字典 和 model类 的转换
在Car这个类中并未声明price这个属性,所以在转换时在Car.m 文件中要进行纠错
Car.m 文件中:
重写父类方法
如果没有定义这个属性,那么重写这个方法,里面什么都不写
通过字典给model 赋值,必须在model类里重写这个方法, 空着就可以
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; @endCar类 .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类里重写这个方法, 空着就可以
相关文章推荐
- IOStream的用法总结
- iOS中tabBar的基础介绍和用法
- TOJ 3853 Farmer Flabby
- LeetCode 1: Two Sum
- Android清单文件详解(二) ---- 应用程序权限声明
- JS-003-innerText 与 innerHTML 区别
- java存取BLOB类型的数据
- Android中shape中的属性大全
- UITableView简单性能优化
- 3.osg中的CallBack回调、NodeVisitor与鼠标键盘的交互
- AAC LATM - 14496-3部分摘要
- 第十章:对象和类
- Qt画银白色Macbook
- 简单工厂
- 2.osg内置几何类型、osg::Geometry的类型与osg::MatrixTransform
- Swift2学习:Swift概览2-控制流
- leetcode2.1.8.3sum
- corosync配置与详解
- LeetCode题解——4SUm
- 调出软键盘 挤掉标题栏咋办