0

私は iOS を使用した最初のプロジェクトに取り組んでおり、Objective-C と xcode の両方の初心者と見なす必要があります。

金額が 1 ~ 200 アイテムの範囲で変化するアイテムのセットを表示するアプリを作成しています。RSS フィードからアイテムを取得し、XML を解析しています。問題なく UITableView にアイテムを表示できましたが、希望どおりに機能しています。

このアプリは iPhone と iPad (6.1 でテスト) の両方に対応しており、私の目標は、iPad の UICollectionView と iPhone の UITableView に項目を表示することです。collectionview にアイテムを表示できましたが、reloadData メソッドを呼び出すと、次のエラーでアプリがクラッシュします。

「スレッド 1: EXC_BAD_ACCESS (コード = 1、アドレス = 0,50c1ecd9)」

答えを探していると、ゾンビをオンにすると問題を特定するのに役立つことがわかりました。次のエラーが表示されます。

[CollectionCell リリース]: 割り当て解除されたインスタンス 0xc177470 に送信されたメッセージ

# Address Category Event Type RefCt Timestamp Size Responsible Library Responsible Caller 1507 0x16941940 CollectionCell リリース 1 00:21.272.192 0 UIKit -[UICollectionView reloadData] 1508 0x16941940 CollectionCell リリース 0 00:21.275.833 0 Foundation -[NSAutoreleasePool ドレイン] 196xCollection Zombie1409 0 -1 00:21.279.332 0 Foundation -[NSAutoreleasePool ドレーン]

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];
}

ニュースセル (UITableViewCell)

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

コレクションセル (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;
}

この問題を解決するために必要なものが含まれていることを願っています。コードを改善するためのアドバイスをお待ちしています。

4

1 に答える 1

0

コードと ARC がオフであるというコメントを見ると、オブジェクトにスペースを割り当てているが解放していないため、メモリ リークが発生している可能性が最も高くなります。

プログラミング、特に動的メモリ管理にかなり慣れていない場合は、オブジェクトの解放について心配する必要がないように、ARC をオンにすることをお勧めします。

また、チュートリアルに従ってください。ARCがオンになっている場合はオンにし、オフになっている場合はオフにします。これは、チュートリアルでオンになっている場合、メモリを解放する目的のサーバーである dealloc メソッドを実装しないためです。

于 2013-10-02T07:45:07.507 に答える