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

10-01 18:50
查看更多