2009-11-21 86 views
2

iPhone和模擬器之間的許多差異真的讓人難以置信。我花了幾個小時試圖弄清爲什麼我的應用程序在模擬器上運行,但在我的iPhone設備上崩潰。事實證明,罪魁禍首是sortedArrayUsingDescriptors。有更多的你喜歡這個嗎?請與我分享。墜毀在iphone上,但不是在模擬器上

要在這個問題上和修復與大家分享:


代碼墜毀在iPhone,但不是模擬器

NSSortDescriptor* aDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"count" ascending:NO] autorelease]; 
NSArray* anNsArray = [[NSArray alloc] init]; 
NSArray* aSortedNsArray = [[NSArray alloc] init]; 

aSortedNsArray = [anNsArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:aDescriptor]]; 

問題是[NSArray arrayWithObject:aDescriptor];


該修補程序是創建一個數組來存儲它:

NSArray* descriptorArray = [[NSArray alloc] initWithObjects:countDescrp, nil]; 
aSortedNsArray = [anNsArray sortedArrayUsingDescriptors:descriptorArray]; 

韋恩·坎貝爾,CA

回答

1
NSSortDescriptor* aDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"count" ascending:NO] autorelease]; 
NSArray* anNsArray = [[NSArray alloc] init]; 
NSArray* aSortedNsArray = [[NSArray alloc] init]; 

aSortedNsArray = [anNsArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:aDescriptor]]; 

這是一個錯誤的初始化機制,如果代碼片段是完整的,你的問題就出在anNsArray對象是空的。您也不需要初始化aSortedNsArray。

所以它應該是:

NSSortDescriptor* sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"count" ascending:NO] autorelease]; 

// Assume you return it as array of objects from a property or method 
NSArray *array = [self objects]; 
NSArray *sortedArray = nil; 
if ([array count] > 0) { 
    sortedArray = [array sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 
} 

// Then you check the sortedArray 
if (sortedArray == nil || [sortedArray count] == 0) 
    [self somethingIsWrong];  

arrayWithObject:(自動釋放)或initWithObject:(手動)僅僅是一種不同的方式來分配的NSArray對象。它不會正常導致崩潰。因爲你關心的是sortedArray不保留描述符數組對象。

3

張貼的代碼不會崩潰。雖然有幾個泄漏的對象,但它不會在模擬器上或設備上崩潰。

我想,你的問題在別處。嘗試使用新項目縮小範圍並僅複製可疑代碼。

2

尼古拉

當我的應用程序很簡單,小它沒有墜毀。這可能是與自動釋放和發佈,如在這篇文章中所述:http://kosmaczewski.net/2009/01/28/10-iphone-memory-management-tips/其中作者指出另一個但類似的問題:

「我相信你使用NSDictionary的dictionaryWithObjects:forKeys時遇到你的應用程序崩潰:和然後發現用initWithObjects:forKeys代替了它:使得你的應用程序運行得很好。「

使用[NSArray arrayWithObject:aDescriptor],NSArray是使用autorelease創建的;相反,使用[[NSArray alloc] initWithObjects:countDescrp,nil]需要具體何時釋放NSArray。

代碼中的簡單更改使我的應用程序不會在iphone上崩潰100%,而舊代碼使應用程序在100%的時間內崩潰。

+0

同樣:您發佈的代碼對您遇到的崩潰不負任何責任。在你的問題中,你指出'sortedArrayUsingDescriptors'在設備上不能正常工作,這是錯誤的。你的錯誤可能是由於內存管理不好造成的。只是開玩笑,爲'initWithObject:'切換'arrayWithObject:'而不理解正在發生的事情並不是真的有用。我的建議是:閱讀並理解Cocoa內存管理指南:http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html – 2009-11-22 11:04:37

0

尼古拉,

你可能是對的。大多數編碼人員很難排除使用Objective C進行錯誤內存管理的可能性。如果我發現了其他真正的潛在錯誤,那麼我會在這裏進行更新。在這段時間內,我會提醒編碼人員注意arraywithobjects和initwithobjejcts之間的區別;明智地使用它們。感謝您的迴應。

韋恩

+0

'arrayWithObject:'和'initWithObject: '是顯而易見的並且衆所周知。這就是爲什麼我向你指出Cocoa內存管理指南:它都在那裏,應該被認爲是每個Cocoa程序員的基礎。 – 2009-11-22 17:19:56

相關問題