什麼是屬性
這是一個示例類,它有幾個例項變數,不使用屬性:
@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 分別稱為 someString
和 setSomeString:
。預設情況下,例項變數的名稱是字首為下劃線的屬性的名稱(因此 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);