<a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流!
一般来说在一个类中 成员变量是会有setter 跟getter方法的。
如果每一个成员变量的setter 跟getter方法都要手写出来的话 很麻烦 很耗时
而且 大部分setter 跟getter方法内容都是简单的赋值 跟return
所以 有些成员变量 没必要手写setter 跟getter方法
@property int age;
这句话代表着 声明setAge:(int)age; 方法与 (int)age方法
@synthesize age = _age;
这句话代表着 实现以上的2个方法 并且访问成员变量_age
如果_age不存在 就会自动生成private成员变量_age
但是在现在的版本中 @property 已经可以 既声明又实现 所以 synthesize 已经用不到了
当然 这只是@property 最初级的用法
1、有时候我们不想声明set方法 可以通过@property来控制
@property (readonly) int age; //这是代表着 只读 也就是只有getter方法 没有setter方法
@property (readwrite) int age;//这种形式代表着 getter、setter方法都有
2、当我们使用oc对象时 需要手动控制内存计数器
比如 对一个oc对象 调用set方法
(void) setBook : (Book *) book
{
if(book!=_book) //需要判断 是否与已有的book相同 若不相同的话则覆盖以前的book对象
{
[ _book release]; // 先对前任book 的计数器减一
_book = book; //覆盖 _book指向的内存地址
[ _book retain];// 对_book现在指向的对象 计数器+1
}
}
这样写 才不会出现内存泄露的问题
但是这些代码完全可以用一句话来代替
@property (retain) Book *book; // 这句话生成上面的方法 适用于oc对象
@property(assign) int age; //这是默认的形式 适用于非oc对象
3、有关多线程管理的问题
oc中 并没有把多线程的问题显露出来 而是对其进行了进一步封装
@property(nonatomic) int age; //代表这高性能
@property(atomic) int age; //这是默认的形式 性能低 在oc项目中一般使用高性能的
4、 setter getter方法的名称生成
@property int age; //这句话生成的名称是系统默认的 setAge: 与 age
但是我们如果不想用 默认名称的话 可以自己设置
@property(getter = abc,setter = setAbc:) int age;
这句话生成的get方法就是 abc
[p setAbc:100];
[p abc];
以上的这些关键词 都可以混着用
@property (readonly, assign) int age;
@property (nonatomic, retain) int age;
在第二条内存管理中 还涉及到一种 循环引用的问题
有两个类 Person 与Card
在Person类中 使用了 Card对象 property(nonatomic,retain) Card* card;
在Card类中使用了Person对象 property(nonatomic,retain) Person *p;
p与card都是oc对象 所以按照上面的规则 应该 使用retain关键词
但是这样的话 就会导致在使用的时候 p与card无法释放
所以 就不能这样写
解决方法是: 一端用retain 一端用assign
把property(nonatomic,retain) Person *p;
改成property(nonatomic,assign) Person *p;即可
<a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流!
黑马程序员_Objective C中的@property 与 @synthesize 快速生成setter getter方法