文章目录
  1. 1. Property
  2. 2. Attribute
  3. 3. 点语法
  4. 4. KVC
  5. 5. KVO

Property

Property属性:简化代码,为实例变量提供了setter、getter方法的默认实现,成员变量也不用再单独声明了。
@property本质是方法,提供getter setter 方法的默认实现
在声明属性时,如果属性对应的实例变量已经在.h文件中声明,则直接生成对应实例变量的getter,setter方法,如果没有声明实例变量,会在该类中添加私有成员变量。

Attribute

Attribute:属性的属性,为属性提供了⼀些关键字⽤以控制setter、getter的实现细节,这些关键字我们称为属性的属性(attribute);
一共3大类attribute:

  1. 读写性控制(readonly、readwrite、setter、getter)
    • readonly,告诉编译器,只声明getter⽅法(⽆setter⽅法)
    • readwrite,告诉编译器,既声明setter⼜声明getter
    • readwrite是读写性控制的默认设置
  2. 原子性控制(nonatomic、atomic)
    • atomic:setter、getter⽅法在多线程访问下是绝对安全的,即
      setter、getter内部做了多线程访问处理。原⼦性控制的默认设置是
      atomic
    • nonatomic:setter、getter⽅法内部不会做多线程访问处理,仅仅是
      普通的setter、getter⽅法
    • 注意:程序开发过程中,setter、getter处处都在⽤,如果使⽤atomic,需要不断
      的对setter、getter加锁解锁以保证线程访问安全,会很占⽤系统资源,降低
      系统性能。 通常设置为nonatomic,某些属性需要线程安全的时候,才定义为atomic。
  3. 语义设置(assign、retain、copy)
    • assign:setter、getter内部实现是直接赋值
      • copy:setter、getter的内部实现会做内存优化。
    • retain:setter、getter的内部实现也会做内存优化。
      例如:
@property(nonatomic,retain)NSString *name; 
- (void)setName:(NSString *)name{
 if(_name != name){
 [_name release];
 _name = [name retain]; // copy 同理
 }
} 
- (NSString *)name{
 return [[_name retain]autorelease];
}

如果属性是⾮对象类型(⽐如int,float等)属性的语义设置使⽤assign,
如果属性是对象类型(⽐如NSStrng、NSArray等)属性的语义设置使⽤retain,
如果属性是对象类型并且想得到参数的copy,使⽤copy关键字。

点语法

属性是⼀对getter、setter⽅法,点语法是属性的另⼀种调⽤格式。比较简单不做过多说明;

KVC

KVC(Key-Value-Coding)键值编码,是一种间接访问实例变量的方法
修改值的方法:

  • setValue:forKey:
  • setValue:forKeyPath:
  • setValue:forUndefinedKey:
  • setValuesForKeysWithDictionary:

获取值的方法:

  • valueForKey:
  • valueForKeyPath:
  • valueForUndefinedKey:

当key不存在的时候,会执行setValue:forUndefinedKey:往往在.m文件中重写该方法,避免程序崩溃;
上面部分的综合代码:

Teacher *teacher=[[Teacher alloc]init];  
teacher.name=@"lisi";  
teacher.classs=12;  
    teacher.level=@"A";  
teacher.count=48;  
NSLog(@"name=%@ classs=%d level=%@ count=%d",teacher.name,teacher.classs,teacher.level,teacher.count);  
[teacher setValue:@"zhangsi" forKey:@"name"];  
NSLog(@"%@",teacher.name);  
[teacher setValue:@"B" forKey:@"level"];  
[teacher setValue:@14 forKey:@"classs"];  
[teacher setValue:@49 forKey:@"count"];  
NSLog(@"name=%@ classs=%d level=%@ count=%d",teacher.name,teacher.classs,teacher.level,teacher.count);

KVO

KVO(Key Value Observing) 键值监听
常用方法:

  • addObserver:forKeyPath:options:context:
  • removeObserver:forKeyPath:
  • removeObserver:forKeyPath:context:
  • observeValueForKeyPath:ofObject:change:context:

扫描下面二维码,关注公众号,干货满满:

文章目录
  1. 1. Property
  2. 2. Attribute
  3. 3. 点语法
  4. 4. KVC
  5. 5. KVO