View Controller中的Lazy Instantiation

时间:2013-03-08 04:03:57

标签: ios objective-c xcode

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

}

1 个答案:

答案 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会崩溃”,如果您包含崩溃中的调试器日志和堆栈跟踪,这将是有用的。