我有一个按钮,可以触发类中数组的随机声音。我的视图控制器中有一个由 IBAction 触发的延迟实例化,但我觉得这是不正确的,原因有两个:
1)我经常看到人们在getter 和 setter中做 LI 。
当我尝试在 getter/setter 中执行 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];
}