这是一个示例类,它具有几个实例变量,而不使用属性:
@interface TestClass : NSObject {
NSString *_someString;
int _someInt;
}
-(NSString *)someString;
-(void)setSomeString:(NSString *)newString;
-(int)someInt;
-(void)setSomeInt:(NSString *)newInt;
@end
@implementation TestClass
-(NSString *)someString {
return _someString;
}
-(void)setSomeString:(NSString *)newString {
_someString = newString;
}
-(int)someInt {
return _someInt;
}
-(void)setSomeInt:(int)newInt {
_someInt = newInt;
}
@end这是创建简单实例变量的大量样板代码。您必须创建实例变量并创建访问器方法,该方法除了设置或返回实例变量外什么也不做。因此,在使用Objective-C 2.0时,Apple引入了属性,这些属性会自动生成部分或全部样板代码。
这是上面用属性重写的类:
@interface TestClass @property NSString *someString; @property int someInt; @end @implementation testClass @end
属性是与自动生成的getter和setter配对的实例变量。对于名为的属性someString,分别调用someString和的getter和setter setSomeString:。默认情况下,实例变量的名称是带有下划线前缀的属性的名称(因此,的实例变量someString称为_someString,但是可以用@synthesize本@implementation节中的指令覆盖此变量:
@synthesize someString=foo; //names the instance variable "foo" @synthesize someString; //names it "someString" @synthesize someString=_someString; //names it "_someString"; the default if //没有@synthesize指令
可以通过调用getter和setter来访问属性:
[testObject setSomeString:@"Foo"]; NSLog(@"someInt is %d", [testObject someInt]);
也可以使用点表示法来访问它们:
testObject.someString = @"Foo"; NSLog(@"someInt is %d", testObject.someInt);