2014-12-02 36 views
0

我是iOS新手,想了解一些需要轉換爲Java的Objective C代碼。屬性的空存取方法

在.h文件中有很多方法聲明是這樣的:

@interface SomeClass : NSObject<NSCoding> 
    // Some score 
    - (int)score; 
@end 

,並在.m文件有:

@interface SomeClass() 

@property(nonatomic) int score; 

@end 

但聲明存取方法得分在SomeClass中從來沒有在任何地方實現。

所以我的問題是:

  1. 是它通常把性能的.m文件,即使它裏面寫@interface(這對我來說是屬於.h文件)

  2. 爲什麼有一個未實現的訪問器方法(或者是別的嗎?)。 @property自動創建訪問器方法,所以這似乎是無用的。只是爲了讓人能評論該方法嗎?

回答

3

只是注意,你連接的代碼是在我看來不好的做法,因爲他們應該在頭一個只讀屬性,然後就重新聲明其作爲類擴展只讀。

這一邊:

  1. 是它通常把性能的.m文件,即使它裏面寫@interface(這對我來說是屬於.h文件)?

如果在頭一個只讀屬性,並要添加一個setter方法在實現文件中,供內部使用,那麼你可以重新聲明屬性的一類延伸和setter方法是爲你創造。因此,你不必自己編寫二傳手。

在你的情況,程序員有一個屬性與getter和setter,但只想公開暴露getter方法。

  1. 爲什麼有一個未實現的存取方法(或者是別的什麼?)。 @property自動創建訪問器方法,所以這似乎是無用的。只是爲了讓人能評論該方法嗎?

訪問器方法實際上並未實現,它只是自動創建的。 @property聲明與最新版本的LLVM一起經歷一個稱爲自動合成的過程。這種自動合成將查看@property聲明併爲其生成相應的setter和accessor方法。

程序員只是想公開暴露getter方法,這就是爲什麼他們把它放在公共類接口。

下面是自動生成的getter和setter方法的一個例子:

@interface MyClass() 

@property (nonatomic) int integerOne; 
@property (nonatomic, readonly) int integerTwo; 
@property (nonatomic, readonly, getter = myIntegerThree) int integerThree; 

@end 

什麼,這些將做如下:

integerOne:生成名爲_integerOne的實例變量,創建一個名爲integerOne getter方法和創建名爲setIntegerOne:的設置器方法

integerTwo:生成名爲_integerTwo的實例變量,創建一個名爲integerTwo

integerThree getter方法:生成一個名爲_integerThree的實例變量,創建一個名爲getter方法myIntegerThree

您可以通過只實現自動生成的方法避免了autosynthesis 。如果你實現了所有的自動生成方法,你也必須自己綜合實例變量。例如,如果我聲明只讀屬性,然後重寫自動創建的獲取器,則必須將@synthesize property=_property;置於實現文件的頂部,以便我可以獲取名爲_property的實例變量。