2009-03-05 21 views
0

UICachedDeviceWhiteColor görüntüleyen bir bellek sızıntısı var. Ben hiçbir yerde UICachedDeviceWhiteColor kullanmıyorum ve bunun üzerine bir arama bu iPhone-SDK bir hata olduğunu söyleyerek insanları döner. Bu blog girişi bulunan: http://piezoelectrics.blogspot.com/2009/02/uicacheddevicewhitecolor-leak-in-iphone.htmlUICachedDeviceWhiteColor ve NSAutoRelease tablo hücresi mem sızıntıları için

ama

#import "NSAutoreleasePool.h" 

Bir "hatası: NSAutoReleasePool.h: böyle bir dosya veya dizin" olsun bulamıyor. Bu bellek sızıntısı veya masa hücrelerini uçlarından ayırmanın doğru bir yolu var mı? İşte

Şu anda bunu yapıyorum nasıl:

Burada bir alloc görmüyorum

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

UITableViewCell *cell = nil;  
cell = [tableView dequeueReusableCellWithIdentifier:@"CellNameIdentifier"]; 

if (cell == nil) { 
[[NSBundle mainBundle] loadNibNamed:@"CellName" owner:self options:nil]; 
//cellName is IBOutlet to XIB's tablecell. I reference it several times in this calss 
cell = cellName; 
} 

return cell; 

} öyleyse neden bir mem sızıntısı olurdu? Çünkü mülk beyanının

@property (nonatomic, retain) IBOutlet UITableViewCell *cellName; 

cevap

1

, kendisine geçirilen nesne koruyacaktır sizin cellName özelliği için sentezlenen ayarlayıcı: bu bir sorun olabilir.

dealloc yönteminizde cellName öğesine bir sürüm mesajı göndermelisiniz. Ayrıca, CellView'in her istendiğinde ucu yüklemeye gerek yoktur. Ya hücreAdı! = Nil olup olmadığını kontrol edin ve döndürün ya da rejectIdentifier öğesini hücreye ayarlayın. Böylece dequeueReusableCellWithIdentifier tarafından bulunabilecek şekilde ayarlayın.

1

Aslında, tablo görünümü hücreniz için bir NIB kullanıyorsanız (normalde özel bir şey yapmıyorsanız, normal olarak gerekli değildir), yeniden kullanılabilir tabloya her vurulmadığınızda onu yüklemeniz gerekir hücreyi görüntüle. Aşağıdaki kod biraz daha temiz görünüyor düşünüyorum:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyID"]; 
if (cell == nil) { 
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CellName" 
        owner:self options:nil]; 
    cell = [nib objectAtIndex:1]; 
} 

objectAtIndex: Hücre ELVES (sıfır nesne dosyası sahibidir) ilk nesne ise 1 numara çalışır. tablo görünümü hücrelerini yapmak için

bazı notlar:

  • dolaylı bir özellik veya el ile atayarak ya cep nesneleri korumak vermeyin. Bu, yeniden kullanılabilir tablo hücresi işlevselliğinin hücre belleğini boşaltamayacağından düzgün çalışmamasını sağlayacaktır.
  • Arabirim oluşturucusundaki hücre yeniden kullanım tanımlayıcısını, bir NIB kullanıyorsanız kodda yapamadığınız için ayarlamayı unutmayın.
  • Her zaman hücrenin otomatik olarak seçildiğinden emin olun. Manuel olarak yapın ya da otomatik olarak yüklenen belleği döndüren bir kakao işlevi kullandığınızdan emin olun (objectAtIndex: yöntemi gibi).
+0

# 1 için, özellik nitelikleri yalnızca 'nonatomic' içeriyor mu? # 3 için, hücrenin otomatiği nerede ... dealloc - ama bu doğru demek değil mi? – 4thSpace

+0

Bir yorumda ayrıntı veremiyorum (çok kısa). Objektif C bellek yönetim kağıdını okumalısınız gibi geliyor. Referans sayılarını sıkı bir şekilde kavradığınızdan emin olun ve saklayın, bırakın ve bırakın. Otoriterlik konusunda da bir bölüm var. Yardım edebilirsem bana [email protected] adresinden bana mail gönder. –

İlgili konular