我有一个按钮,可从类中的阵列触发随机声音。我的视图控制器中有一个由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];
}
最佳答案
您的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崩溃”这样的 future 问题,如果包含调试器日志和崩溃中的堆栈跟踪,这将很有帮助。