2012-01-27 62 views
1

我已經看到了很多這樣的代碼奇怪的分配

header.h

@interface Foo : NSObject 
{ 
    NSString *str; 
} 

@property(nonatomic, retain) NSString *str; 
@end 

,然後在執行

@implementation Foo 
@synthesize str = _str; 
@end 

我不明白什麼好處使用這種轉讓?

@synthesize str = _str; 
+0

[在Objective C中用下劃線前綴屬性名稱](http://stackoverflow.com/questions/3521254/prefixing-property-names-with-an-underscore-in-objective-c) – 2012-01-27 16:14:17

+0

BTW請務必閱讀最受讚譽的答案,而不僅僅是被接受的答案。 – 2012-01-27 16:14:47

回答

3

這只是一個常見的命名約定。

在您的實現中,您可以區分直接訪問通過屬性訪問器訪問變量。

如果您嘗試訪問代碼中的str,例如[str length],代碼將無法編譯。您需要執行[self.str length]或[_str length]。

...因爲它是一個NSString不變的屬性,所以使用copy而不是retain

+1

您可以使用與可變性無關的保留...。 – 2012-01-27 16:22:51

+1

@GradyPlayer保留對於具有可變子類的對象來說不是一個好主意,因爲可變對象可以在您不知情的情況下進行更改。它更安全地使用複製 – wattson12 2012-01-27 16:52:15

+0

@GradyPlayer http://stackoverflow.com/questions/387959/nsstring-property-copy-or-retain – bandejapaisa 2012-01-29 09:50:30

3

@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)作爲前綴,有很多問題。

0

下面是如何可以使用名稱變更有用一個簡單的例子:如果你不會合成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],這是行不通的。說得通?

希望這會有所幫助。