2013-10-02 4 views
0

Я работаю над своим первым проектом с iOS и должен считаться новичком с Objective-C и xcode.Ошибка утечки памяти reloadData UICollectionView

Я создаю приложение, которое отображает наборы предметов, количество которых может варьироваться от 1 до 200 единиц. Я извлекаю элементы из RSS-каналов и разбираю XML. Я смог показать элементы в UITableView без проблем, и он работает так, как я этого хочу.

Приложение предназначено как для iPhone, так и для iPad (тестирование на 6.1), и моя цель - показать элементы в UICollectionView на iPad и в UITableView на iPhone. Я был в состоянии показать элементы в CollectionView, но когда я вызываю метод reloadData сбои приложения со следующей ошибкой:

«Тема 1: EXC_BAD_ACCESS (код = 1, адрес = 0,50c1ecd9)»

в моих поисках ответа я прочитал, что поворот на зомби может помочь мне найти проблему, это дает мне эту ошибку:

[CollectionCell релиз]: сообщение, отправленное высвобождены например 0xc177470

# Адрес Категория события Тип RefCt Timestamp Размер Ответственная библиотека Ответственный звонящий 1507 0 x16941940 CollectionCell Release 1 00: 21.272.192 0 UIKit - [UICollectionView reloadData] 1508 0x16941940 CollectionCell Release 0 00: 21.275.833 0 Фонд - [NSAutoreleasePool drain] 1509 0x16941940 CollectionCell Zombie -1 00: 21.279.332 0 Фонд - [ NSAutoreleasePool drain]

CollectionCell - это мой пользовательский класс UICollectionViewCell.

я обеспечу как код для UITableView и UICollectionView который я думаю, имеет самое непосредственное отношение к источнику проблемы:

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

static NSString *CellIdentifier = @"NewsCell_iPhone"; 
UITableViewCell *cell = nil; 
cell = (NewsCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

if (cell == nil) { 
    NSArray *nib = nil; 
    nib = [[NSBundle mainBundle] loadNibNamed:@"NewsCell_iPhone" owner:self options:nil]; 
    cell = [nib objectAtIndex:0]; 
} 

UICollectionView:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"CollectionCell"; 
UICollectionViewCell *cell = (CollectionCell *)[collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath]; 

if (cell == nil) { 
    NSLog(@"Test"); 
    NSArray *nib = nil; 
    nib = [[NSBundle mainBundle] loadNibNamed:@"CollectionCell_iPad" owner:self options:nil]; 
    cell = [nib objectAtIndex:0]; 
} 

NewsCell (UITableViewCell)

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{ 
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
if (self) { 
    // Initialization code 
} 
return self; 
} 

CollectionCell (UICollectionViewCell)

- (id)initWithFrame:(CGRect)frame { 

self = [super initWithFrame:frame]; 

if (self) { 
    // Initialization code 
    NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"CollectionCell" owner:self options:nil]; 

    if ([arrayOfViews count] < 1) { 
     return nil; 
    } 

    if (![[arrayOfViews objectAtIndex:0] isKindOfClass:[UICollectionViewCell class]]) { 
     return nil; 
    } 

    self = [arrayOfViews objectAtIndex:0]; 
} 
return self; 
} 

Надеюсь, я включил то, что необходимо для решения этой проблемы. Я открыт для любых советов по улучшению моего кода.

+0

Я не думаю, что вы включили все. Посмотрите на ошибку, она говорит [выпуск CollectionCell] <- я не вижу выпуска в вашем коде. –

+0

Я не выпускаю CollectionCell нигде в моем коде, по крайней мере, не вручную, так как я не могу найти вызов для выпуска.Я предполагаю, что это как-то связано с методом initWithFrame, я взял его из учебника. – user2833970

+0

ARC включен или выключен? –

ответ

0

Увидев ваш код и ваш комментарий, что ARC выключен, утечка памяти, скорее всего, происходит потому, что вы выделяете пространство для своих объектов, но никогда не выпускаете его.

Если вы довольно новичок в программировании, особенно в динамическом управлении памятью, я бы предложил включить ARC, чтобы вам не пришлось беспокоиться о выпуске объектов.

Также, следуйте инструкциям, если он включен, включите его, если он выключен, выключите его. Это связано с тем, что если он включен в учебник, он не будет реализовывать методы dealloc, которые используют сервер для освобождения памяти.

+1

Спасибо за совет от вас и Неркателя. Превращение ARC в результаты с загрузкой ошибок с тех пор, как я был (автоматически) выпущен, поскольку он был включен в другие учебники, за которыми я следил. Я включу ARC в свой следующий проект. Ответ Nerkatel решил проблему на данный момент, и я еще кое-что прочитаю об управлении памятью, чтобы я не допустил ошибку. – user2833970

Смежные вопросы