Objective-C中@property和@synthesiz
在Objective-C中,@是Objective-C的标志,证明您正在使用Objective-C语言!
针对Objective-C语言中的关键词@property与@synthesize的使用进行了一个简要的分析(自己所理解的).
下面是自己编写的一个例子:建立一个Person类,其中省略了方法的声明.
1)在.h头文件中:
@property在头文件中应用于声明:
例如:
@property NSInteger age;
编译器会自动在.h头文件中声明了2个方法:(setter,getter方法)
- (NSInteger)age; - (void)setAge:(NSInteger)age;
2)在.m实现文件中:
@sythesize在.m实现文件中应用于实现:
例如:
@synthesize age = _age;
编译器会自动在.m文件中实现2个方法:(setter,getter方法)
- (void)setAge:(NSInteger)age
{
_age = age;
}
- (NSInteger)age
{
return _age;
}
请注意:
在Xcode4.5以后的版本中,可以省略@synthesize,编译器会自动添加getter和setter方法的声明和实现,同时会默认访问_age这个成员变量,如果找不到这个变量,会自动生成_age的私有成员变量.
3)@property语法的写法:
例如:
@property(nonatomic, retain) NSString *name;
@property(nonatomic, copy)NSString *gender;
其中在@property后的()括号中的参数如下:(以及其意义)
readwrite:可以产生和使用getter和setter方法.
readonly:只产生和使用getter方法,不能产生和使用setter方法.
assign:默认类型,在setter中直接进行赋值使用的,不进行retain操作
retain:setter方法中,对参数进行release释放旧值,再retain新值.释放旧对象,将旧对象的值赋予输入对象,再提高输入对象的引用计数为1.
copy:setter方法进行copy操作,与retain一样, 建立一个引用计数为1的对象,然后释放旧对象
nonatomic:禁止多线程,变量保护,提高性能
atomic:系统默认,这个属性是为了保证程序在多线程情况,编译器会自动生成一些互斥加锁代码,避免该变量的读写不同步问题。
strong:强引用,也是我们通常说的引用,其存亡直接决定了所指向对象的存亡,如果不存在指向一个对象的引用,并且此对象不再显示在列表中,则此对象会被从内存中释放.
weak:弱引用,不决定对象的存亡,即使一个对象被持有无数个弱引用,只要没有强引用指向它,那么还是会被清除
setter=: 对setter方法重新定义一个名字.
getter=: 对getter方法重新定义一个名字.
据上述所说的参数类型中,copy和retain是最为复杂的,下面就这两项进行一个简要的分析:
retain:
例如:
@property(nonatomic, retain) NSString *name;
1)setter方法分析:
- (void)setName:(NSString *)name
{
if ( _name != name) { //判断是否与旧值相同
[ _name release ]; //若新值与旧值不同则将旧值释放
_name = [ name retain ]; //赋予新值,此时的引用计数+1
}
}
2)getter方法分析:
- (NSString *)name
{
return [ [ _name retain ] autorelease ];
}
copy:
例如:
@property(nonatomic, copy)NSString *gender;
1)setter方法如下:
- (void)setGender:(NSString *)gender
{
if ( _gender != gender) { //判断是否与旧值一样
[ _gender release ] ; //释放旧值
_gender = [ gender copy ]; //进行对原值的拷贝,开辟新的空间,将地址拷贝,并将新的空间的引用计数+1
}
}
2)getter方法如下:
- (NSString *)gender
{
return [ _gender retain ] autorelease ];
}
注意:
1)nonatomic:如果使用多线程,有时会出现两个线程互相等待对方导致锁死的情况(具体可以搜下线程方面的注意事项去了解)。在没有(nonatomic)的情况下,即默认(atomic),会防止这种线程互斥出现,但是会消耗一定的资源。所以如果不是多线程的程序,打上(nonatomic)即可
2)Objective-C语言,系统默认是ARC模式,所以不论是copy或者retain中的setter和getter,通过@synthesize自动生成getter和setter方法.