2012-11-15 77 views
-1

在didFinishLaunchingWithOptions發佈兩次,第一次代碼:的NSMutableArray由發佈

NSMutableArray *k = [[NSMutableArray alloc] initWithCapacity:10]; 
[k release]; 

(我把它降低到多少調試後,這種情況下),我得到

*** -[__NSArrayM class]: message sent to deallocated instance 0x7576c90 
*** -[__NSArrayM respondsToSelector:]: message sent to deallocated instance 0x7576c90 

如果我檢查在alloc行之後的'k'上保留計數,它是1.如果我用NSArray替換NSMutableArray,一切都很好。這裏發生了什麼?

+0

在這之後你用'k'做了什麼? –

+0

@chrislhardin什麼?這絕對不是這種情況。 'NSMutableArray'(通常)是通過後臺的鏈表實現的,'NSArray'使用實際的數組。不同的環境和構造函數可以改變它的支持方式。 –

+2

發生了什麼是這兩條線以外的事情。我將它們複製到一箇舊的(ARC之前的)測試項目中,並沒有發生錯誤。 –

回答

1

該錯誤必須來自其他地方。這意味着你正在使用它。 否則,你不會有

*** -[__NSArrayM respondsToSelector:]: message sent to deallocated instance 0x7576c90 

但這樣的:

*** -[__NSArrayM release]: message sent to deallocated instance 0x7576c90 

另外,你不應該使用retainCount(明白爲什麼here)。

只要檢查你是否沒有在其他地方使用它。或者,也許你正在使用ARC?在這種情況下,你不需要釋放它。

+0

是的,我檢查了ARC。這是我第一次想到的。另外,當我用調試器遍歷它時,它正是在發行版上給我的那個錯誤。我只是使用retainCount來查看計數是什麼。它應該是1,在那一點上,它是。 –

+1

如果他使用ARC,將禁止「釋放」。所以情況並非如此。 – newacct

0

如果已經啓用了殭屍,但仍然看到錯誤控制檯類似:

2013年8月26日16:08:22.540的測試[1231:303] * - [__ NSDictionaryM respondsToSelector:]:消息發送到釋放實例0x101b039a0

而且您已將您的代碼精簡到幾行,並且您確定不會過度釋放對象,問題很可能是由調試器向已正確發佈的消息發送消息當你單身穿過它的時候,這個對象就是對象。當您不通過代碼時,不會發出控制檯消息。要看到它發生,啓用殭屍和單步通過下面的代碼。發佈後,上述消息被髮送到控制檯。

-(void)testDictionary 
{ 
    NSMutableDictionary *outboundDictionary = [[NSMutableDictionary alloc] init]; 
    [outboundDictionary release]; 
} 
相關問題