我有一个按钮,可以触发类中数组的随机声音。我在我的视图控制器中有一个由IBAction触发的延迟实例化,但我觉得这是不正确的,原因有两个:
1)我经常看到有人在做L.I.在 getters and setters 。
当我尝试做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];
}
答案 0 :(得分:4)
你的getter以递归方式调用自己。不要在self.myClass
getter中访问myClass
。将您的代码更改为:
- (myClass *)myClass
{
if (!_myClass){
_myClass = [[myClass alloc] init];
[_myClass setUpMyClass]; // this method just loads sounds and some text
}
return _myClass;
}
假设myClass
的iVar为_myClass
。如果没有,请将_myClass
更改为iVar。
对于未来的问题,“为什么XXX会崩溃”,如果您包含崩溃中的调试器日志和堆栈跟踪,这将是有用的。