Subclass of class with synthesized readonly property cannot access instance variable in Objective-C
The instance variable _pString
produced by @synthesize
is private to MyClass
. You need to make it protected in order for MySubclass
to be able to access it.
Add an ivar declaration for _pString
in the @protected
section of MyClass
, like this:
@interface MyClass : NSObject { @protected NSString *_pString;}@property (nonatomic, strong, readonly) NSString *pString;@end
Now synthesize the accessors as usual, and your variable will become accessible to your subclass.
I am familiar with this problem. You synthesize the variable in your .m class, so it is not imported along with the header since the _pString variable will be created as part of the implementation, and not the interface. The solution is to declare _pString in your header interface and then synthesize it anyway (it will use the existing variable instead of creating a private one).
@interface MyClass : NSObject{ NSString *_pString; //Don't worry, it will not be public}@property (nonatomic, strong, readonly) NSString *pString;@end
The given answer works perfectly fine. This is an alternative answer, that apparently Apple likes a bit more.
You can define a private extension of your class, a MyClass+Protected.h
file, which needs to be included in MyClass.m
and MySubclass.m
.
Then, in this new file, you redefine the property as readwrite
.
@interface MyClass ()@property (strong, readwrite) NSString * pString;@end
This alternative allows you to use the accessor self.pString
rather than the ivar _pString
.
Note: you still need to keep the definition of pString
in your MyClass.h
as is.