@property是什么?
@property是一个是编译器特性,在Xcode 4.4之前,编译器会自动生成setter和getter方法的声明。
例如:作为方法声明,为别的文件调用,位置则在
@interface
@property NSInteger age;
@end
等价于
@interface
- (void)setAge:(NSInteger)age;
- (NSInteger)age;
@end
生成的setter,getter方法声明,存在一定的格式
存在方法声明自然对应着方法实现,因此,还存在另一个
@synthesize
自动生成setter/getter方法的实现。例如:
作为方法的实现,位置则在
@implementation
@synthesize name; //@synthesize age = age;
@end
左边是属性名,右边是实例变量。如果实例变量不存在,就会创建,但这是一个私有的成员变量, 是在.m文件中生成的, 不是在.h文件中生成的(extension)
@interface Person ()
{
NSString *_name;
}
@end
因此,无法在类外直接通过->_name访问
如果我们实现了setter/getter方法的话,那么编译器便不会再生成相应的setter/getter的实现;如果我们setter和getter均实现,则编译器不但不会生成setter和getter方法的实现,也不会生成默认形式的实例变量,即使实例变量不存在。即@synthesize age = _age; 是无效的
Xcode4.4之后,@property 进行了增强,@synthesize可以省略,默认写法 @synthesize age = _age;