懒惰初始化崩溃

时间:2014-07-07 20:58:39

标签: objective-c memory-management lazy-initialization

我在懒惰地初始化图像时遇到问题。在我的视图控制器中,我试图说明是否未从URL检索图像,然后加载它。

- (UIImage *)image {
    if (!self.image) {
        self.image = [[UIImage alloc] init];

    ... get image data from url ...

        self.image = [UIImage imageWithData:urldata];
    }
    return self.image;
}

任何建议都会非常感激,它会创建大量的UIImage对象并使应用程序崩溃。

1 个答案:

答案 0 :(得分:4)

您正在进行递归通话。切勿在属性的getter或setter方法中访问该属性。

你想:

- (UIImage *)image {
    if (!_image) {
        _image = [[UIImage alloc] init];

    ... get image data from url ...

        _image = [UIImage imageWithData:urldata];
    }

    return _image;
}

self.image的调用会调用此image方法。因此,如果您在self.image方法中调用image,则会以递归方式调用自身。

实际上你可以从getter调用setter,你可以从setter调用getter但是我更愿意保持一致以避免任何可能的问题。