2013-08-01 195 views
0

我一直在多個平臺上測試IOS應用程序,並在iPhone 4S上測試時觀察到一些奇怪的行爲。在執行適用於iPhone 5和iPhone 3S的任務後,該應用程序崩潰。發生崩潰時,調試器上不顯示任何內容,絕對不會在Xcode中出現崩潰日誌或內存警告。我隔離了代碼塊和負責崩潰的特定行。我仍然不明白爲什麼會發生,或者如何找到解決方案。該代碼是下載大量圖像並將其顯示在UIImageView中的更大方法的一部分。代碼如下:IOS - 意外崩潰,無崩潰信息

//fill image tiles with images 
for (int i = 0; i < [objects count]; ++i) 
{ 
    PFObject *imageObject = [objects objectAtIndex:i]; 
    PFFile *imageFile = (PFFile *)[imageObject objectForKey:@"image"]; 
    UIImageView *imageHolder = (UIImageView *)[self.view viewWithTag:(100 + i)]; 

    imageHolder.image = [UIImage imageWithData:imageFile.getData]; 
} 

代碼循環遍歷一個已經從服務器加載圖像文件的對象。每個圖像要分配給的UIImageView都被標記爲100 - 104,因此可以使用循環索引變量來訪問它們。行UIImageView *imageHolder = (UIImageView *)[self.view viewWithTag:(100 + i)]從主視圖中提取UIImageViews。在下一行中,imageHolder視圖被分配了一個圖像,這是導致崩潰的行,並且在註釋時視圖加載沒有失敗。我無法確定這是爲什麼發生,或者它是沒有正確設置的imageFile或imageHolder視圖。也許這裏的某個人可以解釋一下這個問題。

+0

它可以被分配太多的內存和操作系統被終止應用程序沒有任何警告。最近發生在我身上的,沒有例外,沒有記憶警告,它只是終止。將'imageFile.getData'單獨調用到一個單獨的行上,其中包含一個保存'NSData'的變量,然後將數據傳遞給'imageWithData'。這將有助於找出哪兩種方法導致問題。 – progrmr

+0

嘗試在該循環中添加一個對'logMemUsage()'的調用,代碼爲[here](http://stackoverflow.com/a/2921725/1693173),你可以看到你如何釋放內存經過循環。 – progrmr

回答

1

您應該對imageFile.getData有一些保護,因爲它可能會返回nil。您最好使用getData:方法,該方法返回一個錯誤,如果無法訪問數據,則可以使用該錯誤。


NSError *error = nil; 
NSData *imageData = [imageFile getData:&error]; 

if (imageData != nil) { 
    imageHolder.image = [UIImage imageWithData:imageData]; 
} else { 
    NSLog(@"OMG!! %@", error); 
} 
+0

getData:'方法的類是什麼,它是如何使用的? @Wain – ScottOBot

+0

'PFFile',你已經調用了'getData'方法(通過點符號)。 https://www.parse.com/docs/ios/api/Classes/PFFile.html#//api/name/getData: – Wain

+0

所以你的意思是使用'[imageFile getData]'而不是'imageFile.getData'?對不起,讓你拼出來,我相對新的這一點。 @Wain – ScottOBot