2013-06-20 31 views
-1

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

下面是一些代码。

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

什么是'testView'? –

+0

@PraveenS这只是一个常见的UIView。 – Calios

+0

我的猜测是你的testView在你尝试访问它的属性时没有被分配。 在调用“requestForSth”之前,请确保您的testView是一个有效的对象 – Maggie

回答

1

嗯,EXC_BAD_ACCESS意味着您试图访问无效的内存。 在您的-init方法中,您将testBtn分配给自动发布的UIButton对象。

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

在ARC下,默认情况下,这归功于__strong所有权限定符。如果你仍然坚持不移动到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; 
} 
+0

我不知道我是否正确地得到了你,但我在我的-init中保留了testButton,并且它确实停止了崩溃。但是,testView似乎只在第一次加载该项目时才隐藏。 – Calios

+0

谢谢,我收到了你。是的,我保留了testBtn作为您的第一个解决方案。但是当我将layoutSubviews改成viewDidLoad后,加载后testView是全黑的... – Calios