2013-03-08 55 views
3

我有一個按鈕可以從類中的數組觸發隨機聲音。我有一個IBAction觸發的視圖控制器的懶惰實例,但我覺得這是不正確的,因爲兩個原因:視圖控制器中的懶惰實例化

1)我通常看到人們在做L.I.在獲取者和設定者

當我嘗試做L.I.在getter/setter中,我的程序崩潰了,我不知道爲什麼。

2)我視圖控制器IBAction爲的內部執行該延遲實例

這是做懶惰實例化的正確方法嗎?

這裏是不會崩潰的代碼:

- (IBAction)myClass:(UIButton *)sender 
{ 

    if (!self.myClass){ 
     self.myClass = [[myClass alloc] init]; 
     [self.myClass setUpMyClass]; // this method just loads sounds and some text 
    } 


    [self.myClass playSound]; 
    self.myClassLabel.text = [[NSString alloc] initWithFormat:@"%@", [self.myClass someText]]; 

} 

這裏是崩潰的代碼:

- (myClass *)myClass 
{ 

    if (!self.myClass){ 
     self.myClass = [[myClass alloc] init]; 
     [self.myClass setUpMyClass]; // this method just loads sounds and some text 
    } 

    return self.myClass; 
} 

- (IBAction)myClass:(UIButton *)sender 
{ 
    [self.myClass playSound]; 
    self.myClassLabel.text = [[NSString alloc] initWithFormat:@"%@", [self.myClass someText]]; 

} 

該出把在調試器沒有說太多,但有一個綠色箭頭旁邊說

-(myClass *) myClass { 

它說

Thread 1: EXC_BAD_ACCESS (code=2, address =0xbf7ffffc) 

用戶名爲AQUA,該方法setUpMyMethod看起來是這樣的:

-(void) setUpEscha{ 
    self.eschaDialogue = [[NSArray alloc] initWithObjects: 
         [[NSBundle mainBundle] pathForResource:@"Sound1" ofType:@"mp3"], 
         [[NSBundle mainBundle] pathForResource:@"Sound1" ofType:@"mp3"], 
         ... 
         nil]; 

self.eschaLines = [[NSArray alloc] initWithObjects: 
        @"String1", 
        @"String2", 
        @"...", 
        nil]; 

}

+1

你的代碼看起來很好。但是,如果你想要任何真正的幫助,你需要更新你的問題與關於崩潰的確切細節。包含錯誤和堆棧跟蹤。 – rmaddy 2013-03-08 04:26:46

+1

你可以提供調試器的信息,或者顯示'setUpMyClass'的代碼嗎? – aqua 2013-03-08 04:27:08

+1

注意:最後一行應該是:'self.myClassLabel.text = [self.myClass someText];'。這假設'[self.myClass someText]'返回一個'NSString'。 – rmaddy 2013-03-08 04:28:10

回答

4

你消氣劑遞歸調用本身。請勿在myClass吸氣器內訪問self.myClass。你的代碼更改爲:

- (myClass *)myClass 
{ 
    if (!_myClass){ 
     _myClass = [[myClass alloc] init]; 
     [_myClass setUpMyClass]; // this method just loads sounds and some text 
    } 
    return _myClass; 
} 

這是假設你的伊娃爲myClass_myClass。如果沒有,請將_myClass更改爲任何iVar。

對於「爲什麼XXX會崩潰」的問題,如果您在調試器日誌和堆棧跟蹤中包含崩潰信息,將會有所幫助。

+0

如何查看堆棧跟蹤? – Moose 2013-03-08 05:12:48

+1

物業是公共還是私人並不重要。只要您正確引用iVar,就可以解決問題。如果您仍然遇到困難,則需要在聲明iVar,屬性以及與其相關的任何「@ synthesize」聲明處張貼代碼。 – XJones 2013-03-08 05:15:12

+0

我修正了它,當它應該是_myClass時,我將它更改爲self._myClass。它正在工作..謝謝! – Moose 2013-03-08 05:18:32

相關問題