3

クラス内の配列からランダムなサウンドをトリガーするボタンがあります。ビューコントローラでIBActionによってトリガーされる遅延インスタンス化がありますが、次の2つの理由により、これが正しくないと感じています。

1)私は通常ゲッターとセッターでLIをしている人々を見ます。

ゲッター/セッターでLIを実行しようとすると、プログラムがクラッシュし、理由がわかりません。

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];

}

4

1 に答える 1

4

ゲッターは再帰的に自分自身を呼び出しています。ゲッターself.myClass内にアクセスしないでください。myClassコードを次のように変更します。

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

これは、iVarがであると想定していmyClassます_myClass。そうでない場合は、_myClassiVarに変更します。

「XXXがクラッシュする理由」に沿った今後の質問については、クラッシュからのデバッガログとスタックトレースを含めると役立ちます。

于 2013-03-08T05:08:01.577 に答える