一、
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@end
二、
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
NSString *_name;
}
@end
三、
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
NSString *_name;
}
@property (nonatomic, copy) NSString *name;
@end
方式三的写法是一种过时的声明变量的方式,xcode在早期@systhesize没有自动合成属性器之前,需要手写 getter与setter方法,下划线从风格上表明这是类的内部变量,要是需要直接使用变量则需要使用get或者set的方式。
在XCode目前有了自动合成属性器后,编译器会自动帮我们生成一个以下划线开头的的实例变量,所以我们不必去同时声明属性与变量。 我们可以直接用@property的方式来声明一个成员属性,在.m文件中使不使用@systhesize都无所谓,xcode会自动帮你生成getter与setter.
外部点语法等方式访问该属性时都通过getter,setter方式访问的。@property修饰的name属性相当于大括号里定义的_name属性(@property实际上生成_name变量。所以.m文件中访问该属性时用_name或者self.name来访问,name是直接访问内存,self.name是调用getter方法)。其实在大括号中的属性可以不带下划线的,只是为了符合以前的书写习惯。