iOS中property和synthesize的详细说明

时间:2022-10-21 10:01:16

        我们要在一个类中定义属性,首先是要在.h文件中(或者说是在.m文件中的@interface的作用域中)使用关键字property来进行属性的声明,同时,在xcode的4.5版本以前,如果我们想要直接用属性名前面加上下划线构成的变量来进行操作的话,需要在.m文件中写上@synthesize student = _student(这里就用student代表一个属性),这样才能编译通过,成功使用_student这个变量来对属性进行操作。


        1、对于property,可能是再熟悉不过的了,当我们需要定义声明一个属性的时候就要用到它。但是,让我们回想到一个最原始的类的创建,在objective-c中,类在默认情况下是protected的,也就是说,只有本类或者是有继承关系的类才能够拿到这个类的属性进行操作,那么,如果其他类想要操作这些属性就没有办法了。所以,如果我们需要这样的操作,那么就要在这个类里面为属性写上setter和getter方法,来为其他类提供一个类似于接口的东西来操作本类的属性,所以,最原始的类里面应该是这样写的:
@interface Student : NSObject    
{
//age和gender这两个属性的声明
int age;
int gender;
}
//age的getter和setter方法声明
- (int)age;
- (void)setAge:(int)newAge;
//no的getter和setter方法声明
- (int)gender;
- (void)setGender:(int)newGender;
@end
但是,如果试想,一个类有100个属性,那么我们就得写100个getter和100个setter方法,那样的话,类里面的内容就会很庞大杂乱,所以,property的出现正是为了解决这个问题,相信大家也都理解到了property的作用,那就是用property声明的属性会自动去声明setter方法和getter方法,不用我们去手动书写。同时,也可以发现,使用property定义的属性,都可以为属性定义一些说明性的参数,比如我们常用的nonatomic,copy,assign等等。

          2、接着是synthesize,大家最熟悉的应该是这两种写法(这里使用student代表任意一个属性)@synthesize student; 以及 @synthesize student = _student其实,第一个写法等价于 @synthesize student = student,提完了这点,相信大家也都有所明白,有些开发者喜欢直接使用下划线加上属性名来进行操作,有些开发者喜欢使用self.student这种形式来书写,在ARC的机制下两者表面上的差别不是很大,但是有一点需要我们去理解清楚的是(这里说明的情况是xcode4.5以后的版本)synthesize的作用就是让student = ?中的后者这个变量来“代替”属性,从而可以通过操作变量来进行属性的操作,但是有一点最关键的是,使用变量进行操作,属性本身的引用计数是不会增加的,因为没有经过调用setter方法或者是getter方法。但是如果使用self.student这种操作方式的话,实质上是通过setter或者是getter方法进行操作,引用计数会随着不同的操作而改变,了解了这点后就能够更好的避免内存泄露问题。另外,synthesize会自动地生成setter方法和getter方法的实现。通过这些了解,我们知道了使用property和synthesize确实大大优化了我们的代码,让我们的代码看起来更加精简。原文:http://blog.csdn.net/nineteen_/article/details/48393349