2013-07-14 134 views
-1

請賜教以下幾點:只讀屬性,方法和點語法

Q1 - 當訪問屬性是什麼在生成的代碼方面的以下三個聲明之間的本質區別?

@property (nonatomic, readonly, getter = getMyProp) NSString* myProp; 
@property (readonly, getter = getMyProp) NSString* myProp; 
- (NSString*) myProp; 

Q2 - 是[object myProp]完全等同於在任何情況下object.myProp(因爲編譯器不抱怨)?

Q3 - 如果它們相同,爲什麼到處都盛行方括號形式,特別是蘋果的示例代碼?

謝謝!

+2

'getter = getMyProp'確實表明有人正在與系統的標準模式作鬥爭。 Getter方法不應該以'get'作爲前綴。 – bbum

回答

2

(1)爲nonatomic,該值將直接返回。對於隱含atomic,返回值將被自動釋放(將已retain ED和autorelease d之前返回。對於直線上升方法聲明,則不會產生代碼。

注意getter=getMyProp完全是針對的圖案iOS和OS X編程。吸氣劑不與get前綴。

(2)[object myProp]object.myProp是在代碼生成時完全等效。然而,它們不是可待因之前編譯期間等同的。編譯器將錯誤上object.myProp if object是類型id。也就是說,點符號要求明確鍵入對象並明確實現所述方法。 (3)很多示例代碼未必更新,並且考慮到點對括號的語法是可互換的限制(2)(但不管怎樣,您不應該使用id),有些直到使用括號即使是在點上。

+0

+1當隱含的'atomic'被使用時,學習'retain'和'autorelease'是很好的。無可否認,我一直在使用'nonatomic'作爲我的所有屬性。 – dasblinkenlight

+0

不確定第二個。我會說它是一樣的(如果對象類型是id,那麼調用[object myProp]也會給出一個錯誤,但是如果你調用[object performSelector:@selector(myProp)],則不會。 ,詞法分析器使用它們都是一樣的,不是嗎? –

+0

@AlejandroIvánNope;不一樣。點需要一個特定的類型(類或協議),而使用帶括號的語法的'id'會編譯時沒有警告(1)如果沒有潛在的伊娃,那麼非原子根本就不重要,因爲這個方法是在任何以前看過的頭文件中聲明的*某處*,*任何地方*, – bbum