1.属性,是oc提供的一种快速的模式化的创建实例变量的方式。
(1)属性是通过@property标记的,
(2)属性会在背后,默默的帮我们做set和get方法
2.属性做的工作
(1)创建一个实例变量,名字是下划线加属性名,
(2)帮我们自动get和setter 的方式,创建一组方法,
3.点语法,点语法是专门为了setter 和getter 方法配备的一种语法糖。会自动根据语法和语境调用是哪一种方法,
(1) (.)其实就是转换成了getter 和setter 方法,p.hobby.length.字符串的长度。
(2)没有getter 和setter 方法的实例变量是没有办法使用点语法的。
4.属性的属性,
attibute,在我们通过属性来创建实例变量的时候,可以通过属性的属性设置来控制实例变量的生成和方法的创建,
3种(1)原子性控制(2)读写控制(3)内存管理控制。第 1和3种参数必须指定,否则会产生内存泄漏,
(1)原子性,原子是最小单位,atomic是oc中的一种线程保护技术,是防止在未完成的时候,被另一个线程使用,造成数据错误。 但是耗内存,推进使用nonatomic
(2)读写 分只读,可读可写。 默认是可写可读的权限。
(3)修改setter getter 方法名:
1)setter getter 是控制生成的get和set 方法的方法名属性
2)对应的getter 方法还是会自动生成,只是名字换成了我们通过参数传递进去的那个名字。
3)在修改setter 的时候,新的名字后面要加(:),否则会报错,getter 后面不需要加(:),
(4)内存控制属性
1)内存管理控制属性。assign,retain/strong,copy,没有垃圾回收,通过引用计数,回收内存,
2)现在xcode默认的事arc,自动引用计数||另外一种是mrc(手动内存管理,) arc下使用的是strong,mrc下使用的是retain.
3)怎么将arc改成mrc? 去工程的配置文件。buildsetting 搜索 (arc]) (gar),在选项中讲yes 修改为no.
(5)使用原则
1)若属性的类型是基本数据类型,使用assign,
2)若属性的类型存放在堆区的,绝大部分用retain,个别的有特殊需求的需要填写copy.
5.assign 的具体实现:
(1)@synthesize age=_age;创建一个实例变量,变量的名字是( _age),和属性的age产生关联,
(2) set 和get方法的实现
6.KVC是键值编码 key-value-code
(1)作用:是oc提供的一种赋值方式,可以无视访问权限,kvc通过键值对进行对象实例变量的赋值。
setValue forKey会自动调用父类里面的这个方法,将传过来的value的值赋给key对应的实例变量,如果在赋值的过程中发现没有实例变量,会再去调用一遍setvaluue for undifinnedKey;
(2)实现的意义,通过字典,实现批量的数据存储。
[p1 setValuesForKeysWithDictionary:dic];kvc 的生命力,是它存在的意义。