首页 > 代码库 > 黑马程序员_Objective C中的@property 与 @synthesize 快速生成setter getter方法

黑马程序员_Objective C中的@property 与 @synthesize 快速生成setter getter方法

<a href=http://www.mamicode.com/"http://www.itheima.com"target="blank">ASP.Net+Unity开发、.Net培训、期待与您交流!



一般来说在一个类中 成员变量是会有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.mamicode.com/"http://www.itheima.com"target="blank">ASP.Net+Unity开发、.Net培训、期待与您交流!