我正在开发我的第一个iOS项目,应该被认为是Objective-C和xcode的初学者。
我正在构建一个应用程序,该应用程序显示的项目集数量可以从1-200个项目变化。我正在从RSS提要中检索项目并解析XML。我已经能够在没有问题的情况下显示UITableView中的项目,并且它按照我想要的方式工作。
该应用程序适用于iPhone和iPad(在6.1上测试),我的目标是在iPad上的UICollectionView和iPhone上的UITableView中显示项目。我已经能够在集合视图中显示这些项目但是当我调用reloadData方法时,应用程序崩溃并出现以下错误:
“主题1:EXC_BAD_ACCESS(代码= 1,地址= 0,50c1ecd9)”
在我寻找答案时,我读到打开僵尸可以帮助我找到问题,它给了我这个错误:
[CollectionCell release]:发送到解除分配的实例0xc177470的消息
#地址类别事件类型RefCt时间戳大小负责图书馆负责人 1507 0x16941940 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 :(得分:0)
看到您的代码,以及您关闭ARC的评论,内存泄漏很可能发生,因为您为对象分配空间,但从不发布它。
如果您对编程很新,特别是动态内存管理,我建议启用ARC,这样您就不必担心释放对象了。
另外,按照您的教程,如果它已启用ARC,请将其打开,如果已关闭,请将其关闭。这是因为如果它在教程中处于启用状态,它将不会实现dealloc方法,这些方法用于释放内存。