2014-04-23 51 views
2

我有2類作爲每下面:分配值到一個只讀對象的屬性

類ModelA.h

@interface ModelA : NSObject 
    @property (nonatomic, strong) NSArray *arrayA; 
@end 

類ControllerA.m

@interface ControllerA() 
    @ property (nonatomic, copy, readonly) ModelA *modelProperty; 
@end 

@implementation ControllerA 

- (void)someMethod:(NSArray *)sampleArray 
{ 
    self.modelProperty.arrayA = sampleArray; 
} 

如果我t ry給self.modelProperty分配一些東西,我得到一個構建錯誤,說我不能,因爲它只是一個只讀屬性。但是我給它的屬性指定了一些東西,XCode並沒有給出任何錯誤,即self.modelProperty.arrayA = sampleArray只是建立好了。但是,當我通過它進行調試並打印self.modelProperty.arrayA即使sampleArray中有數據,我也會得到零。

問題:是否可以爲readonly對象的屬性賦值?

+2

你在做什麼是完全沒問題的。但是,如果'self.modelProperty'爲'nil',你會看到你得到的結果。確保'modelProperty'有一個值。僅供參考,以私有財產爲只讀是不尋常的。通常情況下,你會讓公共屬性爲只讀,然後在類擴展中進行讀寫,以便課程可以使用它。 – rmaddy

+0

是的,你們都是對的。我分配了一些東西給modelProperty並且工作。謝謝!!! –

回答

1

是否可以將值分配給readonly對象的屬性?

呃,有點。你使用的語言有點混亂。它不是只讀對象;這是一個只讀屬性。並且可以將值分配給存儲在只讀屬性中的對象。

readonly只是表示您不能設置該屬性 - 沒有setModelProperty:設置方法。

不是表示該對象的目標是不可變的。這與const不類似。這意味着你不能設置屬性。

你看到nil的原因是發送到nil回報nil的任何消息。

self.modelProperty.arrayA 

是一樣的:

[[self modelProperty] arrayA] 

如果modelPropertynil(這是從你所示的代碼),這是一樣的:

[nil arrayA] 

返回nil - 與[nil anyMethod]返回nil相同。


最後一點:你有copy集作爲modelProperty財產內存政策,但ModalA類沒有出現實現NSCopying協議。你確定你不想要strong

+0

是的,我希望它是複製。我將實施NSCopying協議。感謝您解釋只讀屬性。在爲modelProperty分配一些東西后,這個工作。謝謝!! –

+0

@techie_woman你能把這個標記爲答案嗎?謝謝。 –

0

Try:_modelProperty = sampleArray