什么是属性

这是一个示例类,它有几个实例变量,不使用属性:

@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 的属性,getter 和 setter 分别称为 someStringsetSomeString:。默认情况下,实例变量的名称是前缀为下划线的属性的名称(因此 someString 的实例变量称为 _someString,但这可以在 @implementation 部分中使用 @synthesize 指令覆盖:

@synthesize someString=foo;    //names the instance variable "foo"
@synthesize someString;    //names it "someString"
@synthesize someString=_someString;        //names it "_someString"; the default if 
                                           //there is no @synthesize directive

可以通过调用 getter 和 setter 来访问属性:

[testObject setSomeString:@"Foo"];
NSLog(@"someInt is %d", [testObject someInt]);

也可以使用点表示法访问它们:

testObject.someString = @"Foo";
NSLog(@"someInt is %d", testObject.someInt);