3

我有一个按钮,可以触发类中数组的随机声音。我的视图控制器中有一个由 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];

}

4

1 回答 1

4

你的吸气剂递归地调用自己。不要self.myClassmyClassgetter 内访问。将您的代码更改为:

- (myClass *)myClass
{
    if (!_myClass){
        _myClass = [[myClass alloc] init];
        [_myClass setUpMyClass]; // this method just loads sounds and some text
    }
    return _myClass;
}

这是假设您的 iVar for myClassis _myClass。如果没有,请更改_myClass为任何 iVar。

对于未来类似“为什么 XXX 崩溃”的问题,如果您包含来自崩溃的调试器日志和堆栈跟踪,将会很有帮助。

于 2013-03-08T05:08:01.577 回答