通常,我们为一个类添加属性的时候,还要为 它添加setter/getter方法,如下:
方法一;
//Person.h文件
@interface Person : NSObject {
NSString* _name;
}
//需要添加getter/setter方法
- (void)setName:(NSString*)name;
- (NSString*)name;
@end
// Person.m文件
#import "Person.h"
@implementation Person
- (void)setName:(NSString*)name {
if(_name != name) {
[_name release];
_name = [name copy];
}
}
- (NSString*)name {
return _name;
}
@end
但是oc提供了一种更为便捷的方式来添加属性,可以简化工作,还是实现上述工作,我们用@property来实现;
方法二
代码修改为
@interface Person : NSObject {
//NSString* _name;//注释掉不用了
}
@property (nonatomic, copy, readwrite) NSString* name;//这样就好了
//Person.m文件
#import "Person.h"
@implementation Person
//不用添加代码
@end
//就这样,实现的效果跟之前一种方法是一样的:有个_name属性,并为它添加了setter/getter方法
@property的用法
这里解释下@property的用法: @propery (参数1,参数2,参数3) 类型 属性名
需要注意的是,这样程序会自动为该属性的名字前面加上一个前缀"_", 实际的属性名就是"_属性名"
这里@property所做的工作如下
1. 生成一个带下划线的属性;当然,前缀下划线也是可以改的,后续会说
2. 为属性自动生成setter/getter方法
我们也可以重新实现set和get方法,优先调用自己实现的set和get方法
@property的三个参数,从教程直接截图吧
这里补充讲下
第二个参数,是跟setter方法的实现有关。
假设我们自己实现set方法,有三种形式,如下
- (void)setName:(NSString *)name {
//形式一,普通赋值 assign
_uame = name;
//形式二,retain
if(_name != name) {
[_namerelease];
_name = [nameretain];
}
//形式三,copy
if(_name != name) {
[_namerelease];
_name = [namecopy];
}
}
//@property在自动生成set方法的时候,编译器是不会自己去检查数据类型而决定用上面三种形式中的哪一种,这就需要我们告诉它,通过第二个参数来实现,具体是该用assign,retain还是copy,目前我还不太清楚,后续学到了在补充吧,先理解这方法。
属性名前缀的修改
如果不想让自动生成的属性前缀是下划线,想换一个,比如想把_name换成$name也是可以的,只要在m文件中加一句
@synthesize name = $name;
当然,这个功能可能用的不是太多