属性:
1. 在类的 .h 文件中声明属性
2. 在类的 .m 文件属性实现
3. 在类的 .m 文件中的@synthesize可以省略了
4. 在类的 .h 文件中的成员变量声明部分可以省略了
属性的三大作用:
1. 声明了成员变量(可见度: 私有的)
2. 声明了setter和getter方法
3. 实现了setter和getter方法
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方法
#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
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类里重写这个方法, 空着就可以