Overriding property getters with lazy loading in Objective-C Overriding property getters with lazy loading in Objective-C objective-c objective-c

Overriding property getters with lazy loading in Objective-C


You might want to declare _infoImageView as a protected variable in the header file alongside with the property.Another idea is to create a public defaultImageView method to call inside the lazy getter.Something like this:

@interface MyGenericClass : UIViewController@property (nonatomic, readonly) UIImageView *infoImageView

...

@implementation GenericClass- (UIImageView *)infoImageView{    if (!_infoImageView) {        _infoImageView = [self defaultImageView];    }    return _infoImageView;}- (UIImageView *)defaultImageView{    return [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"PlaceholderInfoImage"]];}

...

@interface MySpecificSubclass : MyGenericClass

...

@implementation MySpecificSubclass- (UIImageView *)defaultImageView{    return [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SpecialInfoImage"]];}


You could use the technique that UIViewController uses for its view:

- (UIView *)view{    if(!_view){        [self loadView];        NSAssert(_view, @"View must be set at end of loadView");    }    return _view;}- (void)loadView{    // subclasses must set self.view in their override of this.    NSAssert(NO, @"To be overridden by subclass");}