大家。我在视图中添加了一个按钮,并将其设置为在特定条件下隐藏。虽然我第一次在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)
}
答案 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;
}