Objective-C - setter/getter方法的自动生成:
大前提:Xcode在4.4版本之前@property,@synthesize的用法和使用注意:
@property:(写在@interface中)
1> 作用
自动生成setter/getter方法的声明.
2> 语法格式
@property 数据类型 数据名称.
3> 工作原理
编译器在编译的时候会自动的生成setter方法的声明:- (void)set首字母大写的数据名称:(数据类型)数据名称;
自动的生成getter方法的声明:- (数据类型)数据名称;
4>使用注意
1, @property的数据类型和数据名称要和属性一致,属性的数据名称不带下划线;
2, @property的数据类型相同的时候可以批量的声明,数据类型不同是不可以批量声明的;
@synthesize:(写在@implementation中)
1> 作用
自动生成setter/getter方法的实现.
2> 语法格式
@property 数据名称.
3> 工作原理
1, 编译器在编译的时候会自动的生成一个与@property相对应的真私有属性,即声明在@implementation中的.
2, 自动生成setter方法的实现,在方法的内部直接将参数赋值给了它自动生成的真私有属性.
3, 自动生成getter方法的实现,在方法的内部直接返回它自动生成的真私有属性的值.
如下代码:
@interface YYPerson : NSObject
{
NSString *_name;
}
@property NSString *name;
@end
@implementation YYPerson
@synthesize name;
@end
等价于:
@interface YYPerson : NSObject
{
NSString *_name;
}
- (void)setName:(NSString *)name;
- (NSString *)name;
@end
@implementation YYPerson
{
NSString *name;
}
- (void)setName:(NSString *)name
{
self->name = name;
}
- (NSString *)name
{
return self->name;
}
@end
4> 使用注意
1, 因为@synthesize自动生成了一个与@property相对应的不带下划线的真私有属性,而使得在@interface中声明的的带下划线
的属性显得多余,因此可以将@interface中声明的的带下划线的属性注释掉;
但@synthesize自动生成的不带下划线的真私有属性又很不规范,所以@synthesize的时候使用以下格式:
@synthesize @property名称 = 定义在@interface中的带下划线的属性名,即: @synthesize name = _name;
这样写的意义:
1,@synthesize不会自动生成私有属性;
2,自动生成setter方法的实现,在方法的内部直接将参数的值赋值给后面指定的属性.
3,自动生成getter方法的实现,在方法的内部直接返回后面指定的属性的值.
此时代码如下:
@implementation YYPerson
@synthesize name = _name;
@end
等价于:
@implementation YYPerson
{
NSString *name;
}
- (void)setName:(NSString *)name
{
_name = name;
}
- (NSString *)name
{
return _name;
}
@end
2, @synthesize生成的setter方法的实现,没有逻辑判断,是直接赋值或返回的.
如果需要逻辑判断,则需要重写setter方法.
3, @synthesize也可以批量生命,数据类型不同也可以批量声明.
*/