1

小さなiPhone専用アプリケーション(iOS SDK 6.0)を構築していますが、XCodeでEXC_BAD_ACCESS例外が発生します。

アプリケーションにはUITableViewカスタムがありますUITableViewCellUITableViewCellサブクラスにを実装し(ここではこれを呼び出しMyCustomCellます)、コンストラクターに別のパラメーターを追加しました。

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier cellImage:(UIImage *)image;

次のコードを使用して、メソッドののにUIImageが追加されます。contentViewTableCell

imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 100, 50)];
imageView.image = image;

[self.contentView addSubview:imageView];

cellForRowAtIndexPathもちろん、この関数は関数内で呼び出されます。

static NSString *CellIdentifier = @"MyCustomCell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil)
{
    cell = [[[MyCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier cellImage:self.cellImage] autorelease];
}

return cell;

(も)のcellImageプロパティは次のように宣言されます(これも合成されます):ViewControllerUITableViewDelegate

@property (nonatomic, retain) UIImage* cellImage;

画像はviewWillAppear、ViewControllerのメソッドで次の行で初期化されます。

cellImage = [UIImage imageNamed:@"my_image_resource.png"];

このコードは正しく機能しますが、iOS 6.0のみの機能で画像をカスタマイズすると、EXC_BAD_ACCESSが表示されます

cellImage = [[UIImage imageNamed:@"my_image_resource.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 10, 0, 10) resizingMode:UIImageResizingModeStretch];

デバッグは、エラーをトリガーする行を見つけるのに役立ちました-それはinitWithStyleMyCustomCell実装のメソッドにあります:

imageView.image = image;

私は多くのEXC_BAD_ACCESSエラーを調べました。このエラーが表示される理由のチュートリアルも読みましたが、これまでは何も割り当てを解除していません。この時点でいくつかのオブジェクトがリリースされている可能性がありますが、どのオブジェクトを正確に見つけることができず、どのように問題を修正できますか。

また、ViewControllerクラスで2つのプロパティを作成してみました。1つは元の画像を保持するためのもので、もう1つはインセット付きの画像を保持するためのものです。ただし、問題は解決しません。

なぜこれがエラーなのですか?はめ込みのある画像で機能しないのはなぜですか?どうすればこの問題を解決できますか?

ありがとうございました。

4

2 に答える 2

2

ステートメントを実行すると、エラーが表示されますimageView.image = image;。したがって、このステートメントが実行されるとき、オブジェクトimageは存在しません。によって明示的に[release image](ARC を使用しないため)、またはimage自動解放される場合は暗黙的に (たとえば、 で作成した場合)、以前に解放されている必要があります[UIImage imageNamed:...]
Aaron Wojnowski が提案したように、コード ARC を変換するのが最善だと思います。それ以外の場合は、image予期せず解放される可能性があるかどうかを確認してください。

于 2013-02-03T17:59:13.980 に答える
1

cellImage のプロパティを作成しましたが、作成されたセッターの代わりにインスタンス変数を使用して設定しています。自動解放されたオブジェクトを渡しているため、次に参照しようとしたときに解放されている可能性があります。以下でこれを使用してみてください:

[self setCellImage:[[UIImage imageNamed:@"my_image_resource.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 10, 0, 10) resizingMode:UIImageResizingModeStretch]];

またはこれで:

self.cellImage = [[UIImage imageNamed:@"my_image_resource.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 10, 0, 10) resizingMode:UIImageResizingModeStretch];

このコードを使用すると、イメージはセッター内に保持され、次回使用しようとするとメモリが割り当てられ、問題は発生しません。

この複雑なメモリ管理の多くが処理されるため、可能であれば ARC の使用も検討してください。 http://developer.apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

于 2013-02-03T17:31:37.307 に答える