2013-10-08 39 views
0

我使用以下來公開語言數組。前如何在iOS中使用ARC將對象標記爲保留和只讀?

@property(nonatomic,readonly)NSArray *languages; 

分配語言ARC是這樣的:

languages=[[NSArray arrayWithObjects: 
       [[Language alloc]initWithCode:@"es"], 
       [[Language alloc]initWithCode:@"en"], 
       nil] retain]; 

所以,我既能夠保留的對象,也將其標記爲只讀到外部。

使用ARC, 由於我無法手動鍵入「保留」。我如何在不覆蓋setter和getters的情況下做到這一點?有沒有辦法標記屬性只讀(外部)和保留(內部)的ARC?

+0

[objective-c ARC只讀屬性和私有setter實現]的可能重複(http://stackoverflow.com/questions/8566671/objective-c-arc-readonly-properties-and-private-setter-implementation) – Rod

回答

3

retain *和readonly確實與對方無關。 readonly表示該屬性只有一個getter,而不是setter。 retain表示該類維護對該屬性引用的對象的保留(強)引用,並且在ARC下,假定屬性由基礎的綜合實例變量支持,表示該實例變量是變量__strong

如果您想要一個只讀屬性,但可以在類中讀寫,您可以在實現(.m)文件的類擴展中重新聲明該屬性爲readwrite。在標題:

@property (nonatomic, strong, readonly) NSArray *languages; 

然後,在您的m的頂部:

@interface YourClass() 
    @property (nonatomic, strong, readwrite) NSArray *languages; 
@end 

在類的實現,你現在可以使用self.languages = ...;,(或_languages = ...;在初始化)來設置語言屬性。在ARC和非ARC之間,這實際上並不相同...

*在ARC下,更習慣於使用strong而不是retain,但編譯器會以相同的方式對待它們。

+3

您不需要在類擴展中將屬性顯式聲明爲'readwrite',因爲屬性默認爲'readwrite'。 – neilco

+1

對於外部世界,對象只能訪問只讀的對象;並且無論是在課堂還是在外部世界中,都會引用相同的NSArray?只是爲了取悅我的好奇心:如果我們將上述兩個屬性都設置爲「原子」,那麼當我們正在編寫語言並且該類以外的某些對象正在嘗試讀取它時,是否還有額外的工作要做?謝謝。 – Unheilig

+0

@neilco,那是真的。我更願意明確發生了什麼事情。 –