Objective-C property that is readonly publicly, but has a private setter

Objective CProperties

Objective C Problem Overview


I'd like to use the @property syntax to declare a synthesized property that is publicly readonly but has a setter that can be called privately from within the class.

Since it's Objective-C, this basically means that the setFoo: method would be synthesized, but calling it outside of the class itself would result in a warning (unrecognized selector). To trigger the warning I have to declare the property readonly; is there any way to force a synthesized setter that is only available within the class?

Objective C Solutions


Solution 1 - Objective C

I think what you're looking for are called class extensions. You would declare the property read-only in the header:

@interface MyClass : NSObject {
}

@property (readonly, assign) NSInteger myInteger;

@end

Then redeclare in your class extension in the implementation file:

@interface MyClass ()

@property (readwrite, assign) NSInteger myInteger;

@end


@implementation MyClass
    
@end

For more check out Apple's documentation

Solution 2 - Objective C

I might be late, but without extension i did using the following technique

@interface MyClass : NSObject {
 NSString * name;
}

@property (readonly, strong) NSString * name;

@end

on the other hand in implementation file

@implementation MyClass
 @synthesize name;

 - (id)initWithItems:(NSDictionary *)items {
self = [super init];
if(self)
{ 
  name = @"abc";
}

return self;
}

@end

doing so it will set your value and will be accessible as readonly. Thanks.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAdam ErnstView Question on Stackoverflow
Solution 1 - Objective CSean RichView Answer on Stackoverflow
Solution 2 - Objective CMajid BashirView Answer on Stackoverflow