2010-02-04 19 views
2

我正在關注Beginning iPhone 3 Development的示例。在第8章中,我在代碼中犯了一個錯誤。Objective C調試

- (NSMutableDictionary *)mutableDeepCopy 
{ 
NSMutableDictionary * ret = [[NSMutableDictionary alloc] initWithCapacity:[self count]]; 

NSArray * keys = [self allKeys]; 
for (id key in keys) { 
    id oneValue = [self valueForKey:key]; 
    id oneCopy = nil; 

    if ([oneValue respondsToSelector:@selector(mutableDeepCopy)]) 
    oneCopy = [oneValue mutableDeepCopy]; 
    else if ([oneValue respondsToSelector:@selector(mutableCopy)]) 
    oneCopy = [oneValue mutableCopy]; 
    if (oneCopy == nil) 
    oneCopy = [oneValue copy]; 
    [ret setValue:oneCopy forKey: key]; 
} 
return ret; 
} 

在第二responseToSelector,而不是以上的mutableCopy,我已經誤寫它作爲mutableDeepCopy。因此,我從常規數組創建可變數組失敗了一個簡單的副本。

結果控制檯將打印這樣的錯誤消息:

2010-02-04 19:58:28.381段[1806:20B] * WebKit的丟棄在web視圖未捕獲的異常:shouldInsertText:replacingDOMRange: givenAction:delegate:* - [NSCFArray removeObjectAtIndex:]:發送給不可變對象的變異方法

現在我的問題是,如果我正在編寫自己的代碼而不是從書。我怎麼知道這個「發送給不可變對象的變異方法」在哪一行發生?

回答

3

第1步。使用調試器。

運行 - >調試器或Shift-Command-Y。當你的程序遇到類似上面那樣的錯誤時,你可以看到代碼停止的地方。你可以看到Apple's instructions使用調試器的細節,但基本的東西很容易弄清楚。最重要的部分是調試器左上象限中的線程列表面板。它將允許您在堆棧中上下移動以查看代碼中發生錯誤的位置。通常你可以使用它來確定你的哪一個對象被聲明爲不可變且不可變。

第2步。使用儀器。

Instruments功能強大,可以讓你做一些漂亮的東西。在這種情況下,一旦你找到了存儲地址,如果你的意外不可改變的對象,你可以使用儀器來查看該對象的歷史,並希望追溯到它的起源。要使用儀器跟蹤對象,您需要運行帶有對象分配的儀器(運行 - >與性能工具一起運行 - >對象分配)。如果您知道犯規對象的地址,則可以在搜索框中的樂器右下角搜索它。打開Extended Detail視圖(Command-E)查看該對象的位置。

+0

當我在調試器中看不到任何東西時會發生什麼?是否因爲缺少調試符號?我如何添加它們? – huggie 2010-03-21 09:38:19

+0

這可能是因爲您沒有設置任何斷點或者因爲您目前沒有在斷點處停止。試着在你知道被調用的一些代碼開始時設置一個斷點,看看它應該是什麼樣子。 – kubi 2010-03-21 14:55:11