[英]iOS — distinguish an NSDictionary from an NSMutableDictionary?
[英]iOS, NSMutableDictionary
我在我的項目中遇到了一個問題,我在頭文件中聲明了一個 NSMutableDictionary 屬性,如下所示:
@property (copy, nonatomic) NSMutableDictionary *DataDict ;
現在在實現文件中,我繼續初始化這個字典,因為我要使用它,就像這樣:
DataDict = [[NSMutableDictionary alloc]init];
現在,當我這樣做時,當我嘗試向該詞典添加內容時,我會收到此錯誤消息:
-[__NSDictionaryI setObject:forKey:]: 無法識別的選擇器發送到實例 0x885ae60 2012-10-19 16:51:56.040 testing[2297:c07] *由於未捕獲的異常 'NSInvalidArgumentException' 而終止應用程序,原因:'-[__NSDictionaryI setObject: forKey:]: 無法識別的選擇器發送到實例 0x885ae60'
一段時間后,我的項目運行了一千次,我決定取消注釋我的初始化行,就像這樣
//DataDict = [[NSMutableDictionary alloc]init];
這解決了問題。
我的問題是:為什么?
問題在於您定義屬性的方式。 如果將其更改為:
@property (strong, nonatomic) NSMutableDictionary *DataDict ;
而不是copy
一切都應該沒問題。
發生這種情況是因為您基本上說您想要通過生成的訪問器獲取對象的副本,而訪問器返回的是NSDictionary
(不可變副本)。
您可以在此處找到有關 objective-c 屬性的更多信息。
正如旁注:objective-c ivars 通常以小寫字母開頭(大寫名稱用於類),因此dataDict
應該優於DataDict
。
這是因為該屬性具有“復制”屬性,所以 NSMutableDictionary 實例分配/初始化是使用“復制”方法“復制”的,而“復制”方法創建的不是 NSMutableDictionary,而是 NSDictionary。 (“mutableCopy”將創建 NSMutableDictionary)。
也許,您可以使用“保留”而不是“復制”作為屬性。
@property (retain, nonatomic) NSMutableDictionary *DataDict ;
或者,只是不使用“復制”/“保留”,而是使用 ARC。(自動引用計數)。
我有這個確切的問題。 沒有保留/復制/強/弱等的組合可以解決問題。 有效的方法是創建一個臨時的可變字典,加載它,然后將我的原始字典設置為等於它。
NSMutableDictionary * tempD = [[NSMutableDictionary alloc] init];
[tempD setObject: epsTapeCut forKey:LWPrintParameterKeyTapeCut];
[tempD setObject: epsCopies forKey:LWPrintParameterKeyCopies];
[tempD setObject: epsHalfCut forKey:LWPrintParameterKeyHalfCut];
[tempD setObject: epsPrintSpeed forKey:LWPrintParameterKeyPrintSpeed];
[tempD setObject: epsDensity forKey:LWPrintParameterKeyTapeWidth];
self.ePSprintSettings = tempD;
這失敗了:
[self.ePSprintSettings setObject: epsTapeCut forKey:LWPrintParameterKeyTapeCut];
宣言:
@property (nonatomic, retain) NSMutableDictionary *ePSprintSettings;
(但同樣,沒有任何屬性組合會產生影響。)
初始化:
self.ePSprintSettings = (NSMutableDictionary *)[myUserDefaults dictionaryForKey:kEpsPrintSettings];
謝謝你幫我理解。
我很高興這行得通,但我想了解原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.