如果一個對象(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
在此代碼:
@synthesize
將提供實施的getter/setter爲anotherClassObj
所以你可以使用語法:self.anotherClassObj = obj1
;該語法可以在類實現的內部和外部同樣使用;
如果您沒有getter/setter(自動生成或自定義),則可以使用語法_aThirdClassObj = obj2;
直接指定給ivar,並使用簡單指針複製的語義;無論如何,_aThirdClassObj
將無法從該課程以外訪問;
此外,儘管@property ... anotherClassObj
,你仍然可以參考_anotherClassObj
直接在您的.m文件,就像在_anotherClassObj = xxx
,繞過的getter/setter,如果你需要它。
你應該清楚的一件事就是getter/setter不僅是一種使公衆成爲ivar的方法。它們在管理保留計數中也起着重要作用(取決於您在屬性聲明中保留/分配/複製中選擇哪個說明符)。因此,在上面的self.anotherClassObj = obj1;
中,obj1
被分配給_anotherClassObj
並且它也被保留(並且如果_anotherClassObj
先前指向對象,則該對象將被髮送release
)。原始伊娃分配不提供這種設施。
在我看來,屬性的保留計數管理功能比決定我是否使用屬性的可見性更重要。
感謝塞爾吉奧,在.h文件所以每伊娃,如果我們想在.m文件中使用它,並且在它後面放置一個「=」符號(這意味着我們將使用setter),那麼必須有一個屬性?或者我們可以在代碼中找到ivars不採取財產和綜合東西? – Paul
@Paul#2。嘗試閱讀[this](http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17)。 –
@sergio:感謝sergio的編輯!好的,所以這是針對像AnotherClass * _anotherClassObj這樣的「對象」,但我們永遠不會看到整數或任何其他基元的「屬性」?而且,除了保留物之外,通常看到一個沒有使用「屬性」的物體?再次感謝 – Paul