什麼是屬性

這是一個示例類,它有幾個例項變數,不使用屬性:

@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);