按钮setHidden在iOS 5中崩溃

时间:2013-06-20 07:52:03

标签: objective-c ios5 crash uibutton exc-bad-access

大家。我在视图中添加了一个按钮,并将其设置为在特定条件下隐藏。虽然我第一次在iOS5中加载整个项目时崩溃了。在第一次之后,它运行良好。除了Thread1之外,Xcode没有给我任何信息......我想知道是否有人可以提供帮助。谢谢你。

这是一些代码。

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)
}

1 个答案:

答案 0 :(得分:1)

嗯,EXC_BAD_ACCESS表示您尝试访问无效内存。 在-init方法中,您要将testBtn分配给自动释放的 UIButton对象。

我相信如果这个文件是在没有ARC的情况下编译的,那么这是有道理的。 为什么?因为当您执行直接分配时,所有权语义不适用。只有通过 setter方法才能应用正确的所有权语义。

在ARC下,由于默认情况下__strong所有权限定符,因此解决了这个问题。如果您仍坚持不转移到ARC,那么您可以retain UIButton直接将其分配到实例变量中。{/ p>

仔细查看您的代码:

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