I usually lazy instantiate my @property objects in their getter methods like this:
@interface MyGenericClass : UIViewController
@property(nonatomic, readonly) UIImageView *infoImageView
// ...
@implementation GenericClass
- (UIImageView *)infoImageView
{
if (!_infoImageView) {
_infoImageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"PlaceholderInfoImage"]];
}
return _infoImageView;
}
But when subclassing, I would often like to override some of the @properties to be more subclass specific. So I'd like to change the instantiation and do something like:
@interface MySpecificSubclass : MyGenericClass
//...
@implementation MySpecificSubclass
- (UIImageView *)infoImageView
{
if (!_infoImageView) {
_infoImageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"SpecialInfoImage"]];
}
return _infoImageView;
}
But that's not possible, because the subclass can't access the _infoImageView iVar.
Is what I'm trying to do bad style? Or is there a common solution / best practice for this? The only solution I see is to make the iVar public, which feels like violating encapsulation principles...
It feels like this is such a very basic question, that there must be millions of answers already out there, but after searching for hours all I could find was Objective-C: Compiler error when overriding a superclass getter and trying to access ivar , but it provides no solution.