1.属性
@property:表明声明了对象的一个属性
@synthesize:表示创建该属性的访问器
OC中关键字补充:
@interface:声明类
@implementation:实现类
@protocol:声明协议
@required:默认需要实现的方法
@optional:可以选择的,可以不实现
@end:代表声明或者 实现结束,与@interface@implementation@protocol配合使用
@protected:受保护的,该类的实例变量只能在该类和其子类内访问,其他类不能访问
@private:私有的,该类的实例变量只能在该类内进行访问,而其他的类则不可以进行访问
@public:共有的,谁都可以访问
@property:表明声明了对象的一个属性
@synthesize:表示创建该属性的访问器
OC中关键字补充:
@interface:声明类
@implementation:实现类
@protocol:声明协议
@required:默认需要实现的方法
@optional:可以选择的,可以不实现
@end:代表声明或者 实现结束,与@interface@implementation@protocol配合使用
@protected:受保护的,该类的实例变量只能在该类和其子类内访问,其他类不能访问
@private:私有的,该类的实例变量只能在该类内进行访问,而其他的类则不可以进行访问
@public:共有的,谁都可以访问
2.属性的属性attributes
1⃣️读写性控制
readwrite 可读可写系统默认
@property (readwrite)NSString *name;
readonly 只可读不可改只能使用getter不能使用setter方法
@property (readonly)NSString*gender;
getter 给getter方法改名字
@property (getter=fun1)NSString *address;
setter 给setter方法改名字 记得加: 因为setter方法是有参数的
@property (setter=fun2:)NSString *number;
同时使用
@property (getter=fun4,setter=fun3:)NSString *groupName;
2⃣️原子性控制
atomic 默认 多线程使用 占线程资源和内存资源
@property (atomic)NSString *hobby;
noatomic 单线程下使用 以后常用
@property (nonatomic)NSString *job;
属性可以有多个attributes
@property (nonatomic,copy)NSString *height;
3⃣️语义设置
assign 赋值 如果用assign修饰,setter getter内部就是赋值,不需要考虑内存和指针的问题,他修饰标量(非对象类),assign通常用来修饰int float doubl BOOL delegate
@property (nonatomic,assign)NSInteger age;
retain 对象类,一般都是retain来修饰,setter getter方法在内存上做了retain的处理
readwrite 可读可写系统默认
@property (readwrite)NSString *name;
readonly 只可读不可改只能使用getter不能使用setter方法
@property (readonly)NSString*gender;
getter 给getter方法改名字
@property (getter=fun1)NSString *address;
setter 给setter方法改名字 记得加: 因为setter方法是有参数的
@property (setter=fun2:)NSString *number;
同时使用
@property (getter=fun4,setter=fun3:)NSString *groupName;
2⃣️原子性控制
atomic 默认 多线程使用 占线程资源和内存资源
@property (atomic)NSString *hobby;
noatomic 单线程下使用 以后常用
@property (nonatomic)NSString *job;
属性可以有多个attributes
@property (nonatomic,copy)NSString *height;
3⃣️语义设置
assign 赋值 如果用assign修饰,setter getter内部就是赋值,不需要考虑内存和指针的问题,他修饰标量(非对象类),assign通常用来修饰int float doubl BOOL delegate
@property (nonatomic,assign)NSInteger age;
retain 对象类,一般都是retain来修饰,setter getter方法在内存上做了retain的处理
@property (nonatomic,retain)NSString *name;/****************/
copy 说明它遵循了NSCcopying协议,一般情况下用retain即可 setter getter方法在内存上做了copy的处理
@property (nonatomic,copy)NSString *gender;
3.点语法
SingleDog *dog1 = [[SingleDog alloc]init];
[dog1 setName:@"女神"];
NSLog(@"%@",[dog1 name]);
// 直接使用点语法赋值和取值(只要有了setter跟getter方法)
dog1.name = @"宋慧乔";
NSLog(@"%@",dog1.name);
// 直接使用点语法来操作属性
dog1.gender = @"女";
NSLog(@"%@",dog1.gender);
4.kvc
(key-value-Coding)键值编码
// 使用kvc给实例变量赋值 //注意:使用setvalue一定要写对key值
// 类似于setter方法
[dog1 setValue:@"范冰冰" forKey:@"name"];
// 取值 类似于getter方法
NSLog(@"%@",[dog1 valueForKey:@"name"]);
// kvc 也可以给属性赋值 也可以给字典赋值
[dog1 setValue:@"women" forKey:@"gender"];
// kvc 还可以给私有变量取值和赋值(key不能写错 ,字符串匹配)
[dog1 setValue:@"521521" forKey:@"phoneNum"];
NSLog(@"%@",[dog1 valueForKey:@"phoneNum"]);
// 一般从网络上请求下来的数据,一般是数组套字典 字典套数组之类的,直接用kvc去取值和赋值,但这时候别忘了加上forundefinekey方法
(// 为了防止崩溃,专门和setvalueforkey去配套使用
- (void)setValue:(id)value forUndefinedKey:(NSString *)key{
NSLog(@"你写错key值了”);}//)
NSMutableDictionary *dict1 = [NSMutableDictionary dictionary];
NSDictionary *dict2 = [NSDictionary dictionaryWithObjectsAndKeys:@"a",@"name",@"b",@"gender", nil];
[dict1 setValuesForKeysWithDictionary:dict2];
NSLog(@"%@",dict2);
[dog1 setValuesForKeysWithDictionary:dict2];
NSLog(@"%@",[dog1 valueForKey:@"name"]);
NSLog(@"%@",[dog1 valueForKey:@"gender"]);
// setvalue:forKeyPath
Pig *pig1 = [[Pig alloc]init];
Food *food1 = [[Food alloc]init];
[pig1 setValue:food1 forKey:@"food"];
[pig1 setValue:@"cabbage" forKeyPath:@“food.name"];
NSLog(@"%@",[pig1 valueForKeyPath:@“food.name"]);
NSLog(@"%@",[food1 valueForKey:@"name"]);
3.点语法
SingleDog *dog1 = [[SingleDog alloc]init];
[dog1 setName:@"女神"];
NSLog(@"%@",[dog1 name]);
// 直接使用点语法赋值和取值(只要有了setter跟getter方法)
dog1.name = @"宋慧乔";
NSLog(@"%@",dog1.name);
// 直接使用点语法来操作属性
dog1.gender = @"女";
NSLog(@"%@",dog1.gender);
4.kvc
(key-value-Coding)键值编码
// 使用kvc给实例变量赋值 //注意:使用setvalue一定要写对key值
// 类似于setter方法
[dog1 setValue:@"范冰冰" forKey:@"name"];
// 取值 类似于getter方法
NSLog(@"%@",[dog1 valueForKey:@"name"]);
// kvc 也可以给属性赋值 也可以给字典赋值
[dog1 setValue:@"women" forKey:@"gender"];
// kvc 还可以给私有变量取值和赋值(key不能写错 ,字符串匹配)
[dog1 setValue:@"521521" forKey:@"phoneNum"];
NSLog(@"%@",[dog1 valueForKey:@"phoneNum"]);
// 一般从网络上请求下来的数据,一般是数组套字典 字典套数组之类的,直接用kvc去取值和赋值,但这时候别忘了加上forundefinekey方法
(// 为了防止崩溃,专门和setvalueforkey去配套使用
- (void)setValue:(id)value forUndefinedKey:(NSString *)key{
NSLog(@"你写错key值了”);}//)
NSMutableDictionary *dict1 = [NSMutableDictionary dictionary];
NSDictionary *dict2 = [NSDictionary dictionaryWithObjectsAndKeys:@"a",@"name",@"b",@"gender", nil];
[dict1 setValuesForKeysWithDictionary:dict2];
NSLog(@"%@",dict2);
[dog1 setValuesForKeysWithDictionary:dict2];
NSLog(@"%@",[dog1 valueForKey:@"name"]);
NSLog(@"%@",[dog1 valueForKey:@"gender"]);
// setvalue:forKeyPath
Pig *pig1 = [[Pig alloc]init];
Food *food1 = [[Food alloc]init];
[pig1 setValue:food1 forKey:@"food"];
[pig1 setValue:@"cabbage" forKeyPath:@“food.name"];
NSLog(@"%@",[pig1 valueForKeyPath:@“food.name"]);
NSLog(@"%@",[food1 valueForKey:@"name"]);