我是新的目標c,我有一些疑惑。我已經看到你可以訪問一個類的屬性,如var-> myProperty等也是這樣variable.myProperty,但我不知道2之間的區別是什麼。我在網上搜索了很多,真的沒有找到確鑿的答案。var-> myProperty和var.myProperty之間的區別
對不起,如果我有拼寫錯誤,提前致謝。
我是新的目標c,我有一些疑惑。我已經看到你可以訪問一個類的屬性,如var-> myProperty等也是這樣variable.myProperty,但我不知道2之間的區別是什麼。我在網上搜索了很多,真的沒有找到確鑿的答案。var-> myProperty和var.myProperty之間的區別
對不起,如果我有拼寫錯誤,提前致謝。
的obj->foo
語法訪問的obj
而obj.foo
訪問屬性(由@property
定義)的ivar foo
。主要區別在於obj->foo
不使用任何getter/setter並直接寫入ivar。
例如,如果你像這樣定義
@property (atomic, strong, readonly) SomeClass *foo;
財產
現代的Objective-C編譯器會自動創建伊娃_foo
併爲你的財產foo
(無需申報伊娃和@synthesize
荷蘭國際集團的屬性。
obj.foo
將自動使用atomic
getter和將財產readonly
(即沒有setter)使用伊娃語法obj->_foo
,您正在閱讀的屬性非原子盟友(!),你甚至可以寫它(記住,該屬性是readonly
!)。
通常很簡單:始終使用屬性語法,除了在init
和dealloc
之外,您使用的是ivar語法。很明顯,當你實際上實現了一個getter或setter時,這是另一個使用ivar語法的地方。 (感謝@ godel9)。 (記住:這是一個粗略的指導方針,還有其他的用例可能需要直接ivar訪問)。
編輯:由於在評論一些批評:這是真的,點語法,也沒有聲明什麼作爲@property
使用,例如一些使用array.count
代替[array count]
(用於NSArray *array
)。但鑑於OP詢問了物業與Ivars的關係,這當然沒有被問到。另請注意,對於給定的@property ... SomeClass *foo
,伊娃不一定是_foo
,但這將是最近ObjC編譯器中自動生成的伊娃爾名稱(可以將屬性映射到任意伊瓦爾)。
有三種情況來考慮:
使用someObject.something
使用self->something
使用otherObject->something
someObject.something
是點語法。就行爲而言,它完全等同於[someObject something]
。這是一個方法調用。請注意,something
不必通過@property
進行聲明。也就是說,someArray.count
或someString.length
在語法上都是有效的。
self->something
正在直接訪問伊娃。這是一個很少使用的語法;難得在幾乎從未。相反,只需使用something =
或[something doSomething]
直接訪問伊娃。不需要->
。
otherObject->something
直接圍繞着otherObject
的實例變量。糟糕的程序員。沒有甜甜圈。不要這樣做。它打破封裝並導致非常脆弱,難以維護的代碼。
上@property
聲明的說明。如果您有:
@property (atomic, strong, readonly) SomeClass *foo;
如果您自動讓編譯器@synthesize
一切,它會創建一個名爲_foo
實例變量。
您應該在您的init
和dealloc
方法中使用直接訪問,但是 - 通常(儘管不總是) - 在其他地方使用setter/getter。即在你的init
你會做_foo = [SomeClass someClassWithSomeMagicValue:42]
(假設ARC,所以沒有retain
需要)。在其他地方,你會做[[self foo] castMagic];
。
現在我明白了,非常感謝你! –
另一個使用伊娃語法的地方是自定義getter和setter。 – godel9
顯然是真的,補充說。 –