我已經看到了很多這樣的代碼奇怪的分配
header.h
@interface Foo : NSObject
{
NSString *str;
}
@property(nonatomic, retain) NSString *str;
@end
,然後在執行
@implementation Foo
@synthesize str = _str;
@end
我不明白什麼好處使用這種轉讓?
@synthesize str = _str;
我已經看到了很多這樣的代碼奇怪的分配
header.h
@interface Foo : NSObject
{
NSString *str;
}
@property(nonatomic, retain) NSString *str;
@end
,然後在執行
@implementation Foo
@synthesize str = _str;
@end
我不明白什麼好處使用這種轉讓?
@synthesize str = _str;
這只是一個常見的命名約定。
在您的實現中,您可以區分直接訪問通過屬性訪問器訪問變量。
如果您嘗試訪問代碼中的str,例如[str length],代碼將無法編譯。您需要執行[self.str length]或[_str length]。
...因爲它是一個NSString不變的屬性,所以使用copy
而不是retain
。
您可以使用與可變性無關的保留...。 – 2012-01-27 16:22:51
@GradyPlayer保留對於具有可變子類的對象來說不是一個好主意,因爲可變對象可以在您不知情的情況下進行更改。它更安全地使用複製 – wattson12 2012-01-27 16:52:15
@GradyPlayer http://stackoverflow.com/questions/387959/nsstring-property-copy-or-retain – bandejapaisa 2012-01-29 09:50:30
@synthesize str = _str;
將意味着爲str
屬性合成的實例變量稱爲_str
。因此,在你的代碼中,它與聲明的實例變量之間存在不匹配。所以你最終會得到兩個實例變量,一個名爲str
,另一個名爲_str
。
你想這樣做:
@interface Foo : NSObject
@property(nonatomic, retain) NSString *str;
@end
@implementation Foo
@synthesize str = _str;
@end
或者這樣:
@interface Foo : NSObject {
NSString *str;
}
@property(nonatomic, retain) NSString *str;
@end
@implementation Foo
@synthesize str;
@end
或者明顯重命名聲明實例變量,_str
。
關於是否以_
(例如 - Prefixing property names with an underscore in Objective C)作爲前綴,有很多問題。
下面是如何可以使用名稱變更有用一個簡單的例子:如果你不會合成str作爲_STR
@interface MyClass : NSObject {
NSString *myString;
}
@property (nonatomic, retain) NSString *myString;
- (NSString *)stringTreatment:(NSString *)str;
@end
@implementation MyClass
@synthesize str = _str;
- (id)init {
self = [super init];
if (self) {
self.str = [NSString string];
}
return self;
}
- (NSString *)stringTreatment:(NSString *)str {
return [str uppercaseString];
}
@end
,你會得到在stringTreatment方法警告說, str的局部聲明隱藏實例變量。
另外,在你的代碼中,你可以給_str賦值並且有一個外部類調用[MyClass str],它會返回它。
因此,長話短說,「str」仍然是您的財產的名稱,「_str」是該財產的內部參考。例如,你將無法使用[MyClass _str],這是行不通的。說得通?
希望這會有所幫助。
[在Objective C中用下劃線前綴屬性名稱](http://stackoverflow.com/questions/3521254/prefixing-property-names-with-an-underscore-in-objective-c) – 2012-01-27 16:14:17
BTW請務必閱讀最受讚譽的答案,而不僅僅是被接受的答案。 – 2012-01-27 16:14:47