2010-04-29 13 views
5

UITableView'ım geri dönüyor EXEC_BAD_ACCESS, ama neden!EXEC_BAD_ACCESS in UITableView cellForRowAtIndexPath

Bu kod parçacığına bakın!

UITableView yükleniyor, bu nedenle allXYZArray != nil çalışıyor ve dolduruldu!

Sonra alta tableView kaydırma ve yöntem cellForRowAtIndexPath Bu hat üzerinde başarısız

yeniden gider, çökmesine sebep yedeklemek:

"NSLog(@"allXYZArray::count: %i", [allXYZArray count]);" 

     (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAt 

IndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"CellIdentifier"; 
UITableViewCell *cell = [theTableView dequeueReusableCellWithIdentifier:CellIdentifier]; 


cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
@try 
{ 
if (allXYZArray == nil) { 
    NSLog(@"nil"); 
    allXYZArray = [ToolBox getMergedSortedDictionaries:allXYZGiven SecondDictionary:allXYZSought]; 
} 
NSLog(@"%i", [indexPath row]); 
NSLog(@"allXYZArray::count: %i", [allXYZArray count]); 
+0

Bu yöntemin geri kalanıyla birlikte kodu yükleyebilir misiniz? [ToolBox getMergedSortedDictionaries: SecondDictionary:] için kod? – MrHen

cevap

10

EXC_BAD_ACCESS programınız geçersiz veya süreçten aksi erişilemez bir bellek adresi erişmeye çalışıyor demektir. Bu genellikle, önceden ayrılmış bir nesneye ileti göndermeyi denediğinizde olur. Bu nedenle, EXC_BAD_ACCESS hata ayıklamadaki ilk adım, programınızın hangi kazada gerçekleştiğine bir ileti göndermeye çalıştığını belirlemektir. Genellikle cevap açık değildir, bu durumda, NSZombieEnabled, hangi kod satırının kazaya neden olduğunu belirlemek için harika bir araçtır.

Sizin durumunuzda, [allXYZArray count] numaralı telefonu aradığınızda kazanın gerçekleştiğini zaten belirlediniz, bu da allXYZArray'u baş şüpheli haline getiriyor. Bu nesne +[ToolBox getMergedSortedDictionaries:SecondDictionary:]'dan döndürülüyor, dolayısıyla hatanın bu yöntemin uygulanmasında olması olasıdır. Memory Management Programming Guide for Cocoa tarafından öngörüldüğü gibi, otomatik olarak iptal edilen yerine bir nesne iade edildiğini tahmin ediyorum. (Bu, SDK'daki en önemli belgelerden biridir. Bu arada, politikaları ve teknikleri ikinci kez doğana kadar bunu ayda bir kez okumanızı öneriyorum.)

1

Tamam, bir hücreyi yeniden yapar değil hücre düzgün başlatılmadı olacağını garanti:

UITableViewCell *cell = [theTableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

hücre bazen boş olacaktır (özellikle ilk kez sanırım).

Sıfır için hücreyi kontrol edin ve varsa, düzgün şekilde başlatın.

if (cell == nil) 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];