属性的本质:
有一个相应的实例变量
通过setter、getter方法来访问实例变量
setter方法:无返回值类型 ,set +属性名首字母大写:(实例变量类型)参数名;
可以给实例变量赋值。
getter方法:有返回值类型,和实例变量类型相同,方法名就是属性名,没有参数。
可以得到实例变量的值。
操作属性的部分,称为点语法
对象.属性 = 值 赋值给实例变量的值
左值 = 对象.属性 取实例变量的值
附加知识:
声明式属性
默认情况下声明式属性并没有解决内存问题,要想解决,
需要在@property TRBook *book;中的@property 后加(retain)关键字,但是他只解决了set,get问题,在dealloc中的减一操作还是要我们自己写,
如果一个对象中的属性是对象类型,声明式属性记得加上return关键字修饰,当一个对象销毁的时候,应该将其所有属性对象,全部release操作,就是有一个属性就release一次,多个就多个。。
@property(参数一,参数二)
参数类型一:
retain:修饰属性是对象leix
assign:修饰基本类型,默认assign类型
copy:修饰一些特殊的对象类型,NSString
readonly:只有get方法,没有set方法
readwrite:即有set方法,也有get方法,就是默认的
getter=menthod:可以修改getter方法的方法名
setter=Menthod:可以修改setter方法的方法名
参数类型二:(多线程中)
atomic 原子性操作,解决线程安全问题,较耗资源 默认的
nonatomic 非原子性操作,存在线程安全问题,节省资源,实际中用这个
声明式属性的bug
自动释放池
可以帮我们解决自动释放(release)对象的操作
工厂方法存在内存释放的问题、getter内存释放的问题,创建多个对像的时候,容易忘记释放对象。
语法规则:
@autoreleasepool{//开始
…………
}//结束,结束的时候会给池中的每个对象发送release消息
默认情况下自动释放池不会管理对象,需要手动将对象放到自动释放池中,由其管理。
向对象发送autorelease消息,就可以将自动