2011-07-01 131 views
3

我有點困惑;如果在.h文件中聲明瞭一個對象,它會被自動視爲「公共」對嗎?但是,我們在.h文件中使用@property來編輯它們?這是我不明白的地方:我們使用私有對象的getter/setter,那麼爲什麼我們使用@property作爲.h文件中聲明的對象,因此被視爲「公共」?公共對象和財產的使用

第二件事,我發現這個例子:我不明白爲什麼我們在代碼中使用@synthesizeprimaryKeyhttp://staging.icodeblog.com/wp-content/uploads/2008/08/9-todom1.png ,爲什麼我們沒有爲database對象使用@property

回答

3

如果一個對象(ivar)在.h文件中聲明,那麼它是公共的是不正確的。只有提供了getter/setter方法,否則它不是。

事實上,@property/@synthesize指令是旨在聲明和定義默認getter/setter方法的工具。所以,不要自己寫,而只是使用指令。

還值得注意的是,聲明屬性可以使用點符號來引用對象的屬性。此外,他們澄清了很多,這要歸功於指定符retain/,這意味着要如何管理內存。 (當然,@synthesize只會爲你正確地做到這一點)。

關於你的樣本,事實上,一個ivar是否與一個房產相關聯是一個設計選擇。可能,您只是重新考慮ivars在.h文件中聲明的假設是默認情況下公開的,並且它會變得更清晰。換句話說:primaryKey是公開的,database不是。

一個很好的教程可以找到here但也不要忘記Apple docs

編輯:

有關從註釋部分你的問題:

沒有必要,每個實例變量有一個屬性,也不是它具有的getter/setter才能被這個類實現的內部使用。

@interface SomeClass : NSObject { 
    AnotherClass* _anotherClassObj; 
    AThirdClass* _aThirdClassObj; 
} 
@property (nonatomic, retain) AnotherClass* anotherClassObj; 
@end 

所以,在這裏你有兩個ivars;只有一個獲得了@property聲明。在你的.m文件中,你可能有,例如

@implementation SomeClass; 
@synthesize anotherClassObj = _anotherClassObj; 

- (void)initWithClasses:(AnotherClass*)obj1 and:(AThirdClass*)obj2 { 
    ..... 
    self.anotherClassObj = obj1; 
    _aThirdClassObj = obj2; 
    ... 
} 

.... 
@end 

在此代碼:

  1. @synthesize將提供實施的getter/setter爲anotherClassObj所以你可以使用語法:self.anotherClassObj = obj1;該語法可以在類實現的內部和外部同樣使用;

  2. 如果您沒有getter/setter(自動生成或自定義),則可以使用語法_aThirdClassObj = obj2;直接指定給ivar,並使用簡單指針複製的語義;無論如何,_aThirdClassObj將無法​​從該課程以外訪問;

  3. 此外,儘管@property ... anotherClassObj,你仍然可以參考_anotherClassObj直接在您的.m文件,就像在_anotherClassObj = xxx,繞過的getter/setter,如果你需要它。

你應該清楚的一件事就是getter/setter不僅是一種使公衆成爲ivar的方法。它們在管理保留計數中也起着重要作用(取決於您在屬性聲明中保留/分配/複製中選擇哪個說明符)。因此,在上面的self.anotherClassObj = obj1;中,obj1被分配給_anotherClassObj並且它也被保留(並且如果_anotherClassObj先前指向對象,則該對象將被髮送release)。原始伊娃分配不提供這種設施。

在我看來,屬性的保留計數管理功能比決定我是否使用屬性的可見性更重要。

+0

感謝塞爾吉奧,在.h文件所以每伊娃,如果我們想在.m文件中使用它,並且在它後面放置一個「=」符號(這意味着我們將使用setter),那麼必須有一個屬性?或者我們可以在代碼中找到ivars不採取財產和綜合東西? – Paul

+0

@Paul#2。嘗試閱讀[this](http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17)。 –

+0

@sergio:感謝sergio的編輯!好的,所以這是針對像AnotherClass * _anotherClassObj這樣的「對象」,但我們永遠不會看到整數或任何其他基元的「屬性」?而且,除了保留物之外,通常看到一個沒有使用「屬性」的物體?再次感謝 – Paul

2

並非標題中的所有內容都是公開的,默認情況下,ivars({}中的項目)已被@protected。 @property的目的是數據封裝。 @synthesize或@dynamic用於聲明你想要實現你的屬性的方式,而其中之一是防止崩潰和警告的必要條件。

資源:
Defining Classes               @protected,@package,@private,@public參考
Declared Properties     @property參考

相關問題