2013-08-31 98 views
1

我正在閱讀一本關於Cocoa的書,並且我有一個作者聲明屬性的部分,@property (strong) NSMutableDictionary *characters;然後將它初始化爲:self.characters = [NSMutableArray array];我會非常感激的是有人可以解釋初始化過程中發生了什麼。我知道[NSMutableArray array]返回一個空數組,但這與NSMutableDictionary有什麼關係?NSMutableDictionary * dict = [NSMutableArray array]

在此先感謝。

回答

2

由於[NSMutableArray array]返回id它是一個錯字,它甚至會編譯時沒有警告。只要執行的代碼被稱爲NSMutableDictionary方法,它就會與unrecognized selector sent to instance NSMutableArray一起崩潰。如果你在它上面調用了count,它不會崩潰,因爲這兩種類型都有這種方法,因此編譯器會很樂意編譯它,因爲你已經告訴它它的一個NSMutableDictionary,並且運行時會找到該方法並調用它,因爲實際上它是一個NSMutableArray。它絕對是一個錯字,我想不出有什麼好的理由你會想要「利用」這種可能性。

+0

其實,便捷構造函數不會顯示警告。 NSMutableDictionary * dict = [NSMutableArray array];',但是NSMutableDictionary * dict = [[NSMutableArray alloc] init];''會給你一個「incompatible types」警告。 –

+0

哦,對。它返回id,因爲它是一個類集羣。 – atomkirk

+0

在ARC下,我認爲'alloc'現在意味着'instancetype'的返回類型,它會發出警告。 – bbum

1

這只是一個錯字。無法使用NSMutableArray alloc/init調用初始化NSMutableDictionary對象。

+0

我不認爲這是一個錯字。我有這個代碼在它的Xcode項目和代碼編譯和運行得很好。 – baxterma

+2

它編譯是因爲'array'返回'id'。試着用這個「詞典」來做任何事情,你會得到一個很好的崩潰。 –

1

該課程可能會向您顯示您聲明屬性的方式,僅供您在編寫代碼時使用。在運行時,實際分配的任何類(在本例中爲NSMutableArray)是實際分配並存儲到內存中的對象的類型。如果您嘗試在對象上使用無法識別的選擇器(如setObject:forKey :),則稍後會拋出異常。

您的特定實現可能不會導致異常,因爲這兩個類都響應某些相同的選擇器(如count),並且它們都使用快速枚舉。

雖然這樣做通常沒有任何好處。事情應該是他們所說的。注意:一旦你對這些東西更加熟悉,就可以看看Objective C的一個叫做Forward Invocation的特性,它允許類通過將請求轉發給另一個類來響應他們還沒有實現的選擇器。

+0

我會做一個更強有力的陳述:這種類型的雙關是一個*糟糕的*想法。如果您需要字典,請使用字典;如果你需要一個數組,使用一個數組。 – bdesham

0

NSMutableDictionary *dict = [NSMutableArray array];這會創建NSMutableArray對象。

Xcode Product menu-> generate output ->Assembly file 

L_OBJC_CLASSLIST_REFERENCES_$_: 
    .quad _OBJC_CLASS_$_NSMutableArray 

NSArray管理有序的對象集合。 NSDictionary管理鍵和值的關聯。您不應該初始化NSMutableDictionaryNSMutableArray

NSMutableDictionary *dict = [[NSMutableArray alloc] init]; // return type is NSMutableArray 

Warning :Incompatible pointer types initializing 'NSMutableDictionary *' with an expression of type 'NSMutableArray *' 

NSMutableDictionary *dict = [NSMutableArray array]; // return type is id + (id)array 

NO Warnings 
相關問題