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");}