クラス内の配列からランダムなサウンドをトリガーするボタンがあります。ビューコントローラで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];
}