2014-02-12 52 views
4

我想向我的用戶展示NSArray(我希望他們只能閱讀它),但在我的課程中,我想使用NSMutableArray只讀,非可變,公共和readwrite,可變,私有@property:更多信息?

我嘗試下面的代碼,並沒有提出任何警告:

// In the .h 
@interface MyClass : NSObject <NSApplicationDelegate> 

@property (nonatomic, readonly) NSArray * test ; 

@end 

// In the .m 
@interface MyClass() 

@property (nonatomic, strong, readwrite) NSMutableArray * test ; 

@end 


@implementation MyClass 

- (id)init 
{ 
    self = [super init]; 
    if (self) 
    { 
     self.test = [[NSMutableArray alloc] init] ; 
    } 
    return self; 
} 

@end 

但是,如果我嘗試從我的類中訪問@propertytest,我可以使用方法addObject:。所以,我猜先前是不可能的。

爲什麼沒有警告,因爲它是?

+0

檢查這個http://rypress.com/tutorials/objective-c/properties.html –

+0

肯定'NSArray':請注意,不要在你的-init:方法使用自我的屬性訪問和你的實現文件中的'NSMutableArray'? – hashier

+1

是的,這是我的觀點! – Colas

回答

0

@property只是語法糖,它會自動爲您創建getter/setter方法。通過.h文件中的readonly,只會爲公衆創建getter方法,但通過在.m文件中覆蓋它,您將在實現中獲得兩種方法。

readwrite是默認的(see here)所以即使省略readwrite在你的實現文件中仍然有@property你會得到一個setter方法。最好在.m文件中明確寫入readwrite,這樣你和其他人會得到一個提示,說明這個變量只能在.h文件中聲明爲只讀。

2

我不認爲混合屬性類型將是一個很好的做法。相反,我會創建一個訪問器,返回私有可變數組的副本。這比較傳統。在頭文件

// In the .h 
@interface MyClass : NSObject <NSApplicationDelegate> 

- (NSArray *)test; 

@end 

// In the .m 
@interface MyClass() 

@property (nonatomic, strong) NSMutableArray *aTest; 

@end 


@implementation MyClass 

- (id)init 
{ 
    self = [super init]; 
    if (self) 
    { 
     _aTest = [[NSMutableArray alloc] init] ; 
    } 
    return self; 
} 

- (NSArray *)test 
{ 
    return [self.aTest copy]; 
} 

@end 
+0

這將是一個非常非典型和混亂的模式。該屬性不應該是readwrite,不應該與accessor方法命名相同。但是,您返回可變容器的「副本」是正確的。 – bbum

+0

@bbum:我的錯誤(錯字),你說得對。我編輯了我的答案是正確的。 – vbali