-1

みんな。ビューにボタンを追加し、特定の条件下で非表示になるように設定しました。iOS5でプロジェクト全体を初めてロードしたときにのみクラッシュします。1回目以降は順調に進んでいます。Xcode は、Thread1 以外の情報を提供してくれません... 誰か助けてくれませんか? よろしくお願いします。

コードの一部を次に示します。

testView.h

@property (nonatomic, retain) UIButton *testBtn;

testView.m

@synthesize testBtn;

-(id)init
{
    self = [super init];
    if (self) {
        testBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    }
    return self;
}
- (void)layoutSubviews{
        testBtn.frame = CGRectMake(110, 100, 100, 24);
        [testBtn setHidden:YES];
        [self addSubview: testBtn];
}

testViewController.m

-(void)requestForSth{
       [testView.testBtn setHidden:NO];   //Thread1: EXC_BAD_ACCESS(code=1,address=0x809a3345)
}
4

1 に答える 1

1

うーん、EXC_BAD_ACCESS無効なメモリにアクセスしようとしたことを意味します。メソッドでは、自動解放-initされたオブジェクトに割り当てtestBtnています。 UIButton

このファイルが ARC なしでコンパイルされた場合、これは理にかなっていると思います。なんで?直接割り当てを実行する場合、所有権のセマンティクスは適用されないためです。setter メソッドを介してのみ、正しい所有権のセマンティクスが適用されます。

__strongARC では、これはデフォルトで所有権修飾子のおかげで解決されます。それでもARCに移行しないことに固執している場合は、インスタンス変数に直接割り当てる前に簡単にできretainます。UIButton

コードを詳しく見てみましょう。

- (id)init {
   self = [super init];
   if(self) {
      //you can explicitly retain it
      testBtn = [[UIButton buttonWithType:UIButtonTypeCustom] retain];
      //or route it through your setter method
      [self setTestBtn:[UIButton buttonWithType:UIButtonTypeCustom]];
   }
   return self;
}
于 2013-06-20T08:27:00.053 に答える