1

私のテーブルビューでは、次のことが起こっています(言い換えれば)

.h

@interface OptionsView : UIView <UITableViewDelegate, UITableViewDataSource>

@property (nonatomic, retain) NSArray *dataSource;

.m

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {

        ...

        self.dataSource = [NSArray arrayWithObjects:options, sections, sponsor,  nil];
    }
    return self;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(self.dataSource) {
        NSArray *ds = [self.dataSource objectAtIndex:indexPath.section];
        NSDictionary *d = [ds objectAtIndex:indexPath.row];
        ActionBlock a = [d objectForKey:ACTION]; // <-- Thread 1: EXC_BAD_ACCESS (code=2, address=0x802)
        if(a != nil) a();
    }
}

didSelectRowAtIndexPathあなたは私が得ていることを見ることができますが、EXC_BAD_ACCESS理由はわかりません。私はアークを使用しているので、ゾンビの問題ではありません(すでにチェックされています)。

ブレークポイントを使用すると、初期化された後に存在することがわかりますself.dataSourceが、後で必要になったときは存在しません。どちらとしても表示されません<nil>。空白だけです。また、これはデバッグでは機能しますが、リリースでは機能しません。それはどういう意味ですか?

**スクリーンショットを追加して編集**

あなたはどちらも表示されないことに気付くでしょdsd..奇妙ですか? xcodeデバッグ

4

2 に答える 2

2

したがって、問題を引き起こす可能性のある場所が2つあります。まず、何ACTIONですか?それはある種のNSStringですか?有効なキーオブジェクトを使用していることを確認したいだけです。ActionBlock次に(そしておそらく問題)、コレクション配列に格納しているある種のコードブロックのように見えます。配列/辞書に保存する前に、そのブロックをコピーしていますか?作成したスコープよりも長く保持(保存)する予定のブロックをコピーする必要があります。これは簡単に実行できます。例えば:

void (^NewBlock)(void) = [^{
    ....code....
} copy];

代わりに:

void (^NewBlock)(void) = ^{
    ....code....
};

[dictionary setObject:[NewBlock copy] forKey:ACTION]; //Assuming #define ACTION @"action"

これにより、ヒープにコピーされ、保存できるようになります。コピーしないと、ブロックが作成されたスコープ外でブロックを参照しようとすると、いつでもBAD_EXC_ACCESSが取得されます。

于 2012-05-31T12:50:26.313 に答える
0

UITableViewControllerの代わりにUIViewControllerを使用しているようです。私の記憶が正しければ、インスペクターに移動して、デリゲートとデータソースをtableViewからUIViewControllerにドラッグする必要があります。正確には覚えておらず、コンピューターを使用していませんが、所有しているすべてのtableViewにUITableViewControllerを使用し始める前に、何度か実行したと確信しています。

ああ、私はあなたの配列の名前としてdataSourceを使用しません。名前の競合を防ぐためだけに。

于 2012-05-31T12:31:01.407 に答える