Subclass of class with synthesized readonly property cannot access instance variable in Objective-C Subclass of class with synthesized readonly property cannot access instance variable in Objective-C ios ios

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.