一 属性 property synthesize
1. 快速的生成 setter 和 getter 的方法
例: 声明部分
原始:
{
NSString *_name;
NSInteger _age;
}
- (void) setName:(NSString *)name;
- (NSString *)name;
- (void) setAge :(NSString *)age;
-(NSString *)age;
修改后:
@property NSString * age;
@property NSString *name;
修改后的 set 和 get 都不用在写
属性的实现:
例:原始:
- (void) setName:(NSString *)name{
_name = name;
}
- (NSString *)name{
return_name;
}
修改后:
@synthesize name;
@synthesize age;
Tips: ①在@ property 里面 同类型的实例变量 可以合并写在一起 比如:上面写道的 name 和 age 是同属 NSString
@property NSString * age;
@property NSString *name;
@property NSString * age,*name;
优势:
1.声明的是同一种类型 可以合并;
2. 省略实例变量的定义 即{}大括号里的东西 系统会自动帮我们设定;
3.属性的实现可以省略,连@synthesize 也可以不用;但是自定义初始化和便利构造器不可以
----------------------------Nyx--------------------------------
②readonly :只读取 自动生成 getter 方法
2.重名组
为了方便比较长的 setter 和 getter 变量名打印 重新取个名字
setter = 新名字; getter = 新名字;
例:
@property (nonatomic,retain,setter=setGGG:,getter=GGG)NSString *name;
[girl setGGG= @"水电费"];NSLog(@"%@",girl GGG]);
注:1⃣️就是将 setter 和 getter 用了你重新定义的新名字打出来 为了不让别人看出你用的是什么实例变量
2⃣️ 你在重写 setter 和 getter 的时候 系统就不会再自定义 syntensize;
----------------------------Nyx--------------------------------
2. 原子性 atomic
① atmoic:原子性 在 setter 和 getter 内部进行了安全的多线程访问
优点:安全
缺点:效率低 在运行的过程中不断的对setter、getter加锁解锁以保证线程访问安全,会很占⽤用系统资源,降低
系统性能。 只在特定那些需要安全的线程的适合才会使用
② nonatmoic:非原子性 可以同时进行普通的 setter 和 getter 无多线程
优点:效率高
缺点:不安全 ,还是公路 可以相对同时行驶,但是容易出车祸呀~
例:
@property (nonatomic,copy)NSString *name;
注:大部分情况下还是nonatomic ,因为atmoic不能同时建立 setter 和 getter 比较麻烦
----------------------------Nyx--------------------------------
3.内存管理
1. assign 操作非对象类型 基本数据类型,比如: NSInteger;CGFloat ;在 setter 和 getter 的内部直接复制
例:
@property (nonatomic,assign)NSInteger age;
- (void)setAge:(NSInteger)age{
_age = age;
}
- (NSInteger)age{
return _age;
}
@property (nonatomic,assign)CGFloat score;
----------------------------Nyx--------------------------------
2.retain 对象类型 比如:NSString; NSArray;
在 setter 和 getter 内部进行优化
例:
@property (nonatomic ,retain)NSString *gender;
- (void)setGender:(NSString *)gender{
if (name != name){
[_name release]
_name = [name retain]
}
}
-(NSString *)name{
return [[_name retain]autorelease];
}
@property (nonatomic ,retain)NSString *age;
----------------------------Nyx--------------------------------
3.copy 对象类型 使用时 要遵守NSCopying 的协议
既能 setter 和 getter 内部实现 也能内部优化
例:
@property (nonatomic,copy)NSString *name;
(cmd +鼠标左键选中 NSString 跳入源代码)@interface NSString :NSObject <NSCopying,NSMutableCopying,NSSecureCoding>
4. 点语法
1.在 main 函数中 快速访问 setter 和 getter 的方法
例:
① 假定我们设定好了 Gril 的声明和方法
传统的访问实例变量方法:
Girl *girl = [[Girlalloc]init];
[girlsetName:@"乐芙兰"];-------->> girl.name =@"乐芙兰"; 点语法
NSLog(@"%@",[girlname]);-------->> NSL@("%@",girl.name);
2.判断什么是 setter 和 getter① 点语法后面跟着等号(=,)设置器(setter)方法
例:girl.name = @"乐芙兰";
② 点语法后面什么也没有是访问器(getter方法)
例: NSL@("%@",girl.name)
----------------------------Nyx--------------------------------
三 KVC Key Value Coding (键值编码)
1.定义:一种间接访问实例变量的方法; 不通过 setter 和 getter 的方法 就可以取到值
key :标识实例变量
value :实例变量对应的值
2.不需要 setter 和 getter 但是需要实例变量名
例: name 就是你在. h 定义的变量名
[son setValue:@"西瓜"forKey:@"name"];
NSLog(@"%@",[sonvalueForKey:@"name"]);
3.通过路径来修改实例变量的值
KVC: [ son setValue:@"akal"forKeyPath:@"girlfirend.name"];
NSLog(@"%@",girl1.name);
传统方法: NSString *aName1 = [[sonvalueForKey:@"girlfirend"]valueForKey:@"name"];
NSLog(@"%@",aName1);
注: KVC 有点类似字典