2012-02-02 68 views
1

這裏是我的代碼 Class.h再次約在Objective-C的getter和setter

@interface Class : NSObject 
{ 
    NSString *str; 
} 

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

@implementation Class 
@synthesize str = _str; 

-(void)someMethod 
{ 
    self.str = @"This is a string"; 
} 

在這裏,我想不出不self.str訪問STR伊娃直接或通過getter和setter方法「產生「通過合成指令?

+1

self.x = foo調用了二傳手,並等價於[自setX的:FOO],同樣適用於干將。如果你不使用self,那麼你正在訪問ivar,儘管只有str自己會是一個編譯器錯誤,因爲ivar被稱爲_str。 – 2012-02-02 20:11:53

回答

2

如果您使用self.str = …這只是[self setStr:…]附近的糖化糖。所以你正在通過setter方法。即使你通過self.str得到一個值,你正在經歷一個訪問器 - 這對了解你是否正在實現延遲加載的屬性很有用。

因爲您(正確地說,在我的意見中)宣稱這是支持商店的名稱,所以您只能直接在_str的情況下訪問iVar。

編輯補充

沒有您例如一個問題 - 你定義它不使用伊娃str(iOS的採用了現代化的運行時,你不需要申報的ivars對於你合成的屬性)。因此,儘管您的代碼正在寫入支持存儲_str,並且如果您要直接訪問str變量,那麼該存儲正在通過self.str使用,您將使用聲明的iVar,而不是您擁有屬性的iVar。

+0

我沒有看到他的代碼中的任何地方,他已經將NSString Ivar聲明爲NSString * _str; ? – 2012-02-02 21:01:50

+0

@PeterWarbo這就是'@synthesize str = _str'正在做的事情。 iVar的實際聲明正在被跳過,這是我只有在指出時纔會注意到的錯誤。 – Abizern 2012-02-02 21:07:55

0

只要您使用「自我」,您就可以訪問該屬性。如果您曾經訪問過「_str」,那麼您將訪問伊娃。

0

您將不會訪問ivar str,因爲屬性str指的是_str

使用

@synthesize str; 

通過財產

1

你行

self.str = @"This is a string"; 

訪問屬性訪問伊娃str。你的伊娃被命名爲_str。

如果您已經將它們命名爲相同的(即不改名伊娃在@synthesize線_STR),self.str仍然會訪問屬性而

str = @"This is a string"; 

反而會訪問伊娃。考慮到將這兩者混合起來是多麼容易,重命名iVar是一種非常好的習慣。