2013-06-20 32 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