如果你在类的声明中包含了属性(property),如:
@interface XYZPerson : NSObject
@property NSString *firstName;
@property NSString *lastName;
@end
那么,编译器将自动为你创建实例变量(instance variable),即 //注:此处有待考证
_firstName 和 _lastName. 但如果用了@synthesize语句的除外,那个语句等于将实例变量和属性同名。
同时,通过 @synthesize语句,
@synthesize fistname;
@synthesize lastname;
编译器将创建两个属性方法(accessor method),其中set方法命名为set + 属性名头字母大写,即相当于创建了:
(void) setFirstName(NSString *str); 和
(void) setLastName(NSString *str);
另一个属性方法get则命名为和属性相同的名字,即相当于创建了
(NSString *)firstname(void);和
(NSString *)lastname(void).
于是,你可以通过诸如如下语句访问(access)或设置(set)对象的属性:
XYZPerson *someOne = [[XYZPerson alloc] init];
NSString *myName = [someOne firstname];
[someOne setFirstName:@"Johnny"];
如果希望get方法不用以上的名字(即和属性同名的名字),可以在定义属性的时候特别说明,如:
@property (getter = getFirstName) NSString * firstName;
可以用点号访问或设置属性,如:
NSString *myName = someOne.firstName;
someOne.firstName=@"Smith";
如果希望属性名和实例变两名(instance variable)不同名,则可以在@synthesize语句中特别标出,如:
@synthesize firstName = first;
这样,对应firstName属性的实例变量名将为first,而不是_firstName.
但如果仅仅是写成
@synthesize firstName
则属性名和实例变量名将相同。