简体   繁体   中英

Objective-C : (private / public properties) making a property readonly for outside class calls and readwrite for self calls

Would you know a way to make a property readonly for outside calls and readwrite for inside calls ?

I've read times ago somthing that seemed like

In the .h

@property(nonatomic, readonly) NSDate* theDate;

In the .m

@interface TheClassName()
@property(nonatomic, retain) NSDate* theDate;
@end

but this raises a warning when compiling the .m "Property theDate attribute in TheClassName class continuation does not match class TheClassName property".

Anyway, it seems to work (can read but not set from outside the class, can do both from inside) but I should have missed somehting to avoid the warning. Or if you know a better way to do this...

In your .h:

@property(nonatomic, retain, readonly) NSDate* theDate;

In your .m:

@interface TheClassName()
@property(nonatomic, retain, readwrite) NSDate* theDate;
@end

This issue is largely eliminated if you're moving to ARC. Instead of two property declarations, you'd declare it once in the header.

@property(nonatomic, readonly) NSDate* theDate;

And then in the class extension, simply declare a __strong instance variable.

@interface TheClassName()
{
    __strong NSDate* _theDate;
}
@end

And synthesize them appropriately in the implementation

@implementation TheClassName
@synthesize theDate = _theDate;

Now you can set the instance variable.

_theDate = [NSDate date];

And ARC will magically inline the appropriate retain/release functionality into your code to treat it as a strong/retained variable. This has the advantage of being faster than the old style (retain) properties as well as ARC inlines the retain/release code at compile time.

If the property is backed by a variable, the variable is read-write from inside the class be default. Make the property read-only, and your design goal will be met. Inside the class, refer to the variable without prepending self. .

In the .m, you shouldn't put @property again. I'm not sure what effect that has, though. Did you mean to use @synthesize?

Note that theDate will be read/write inside the class implementation anyway, regardless of being readonly to the outside world.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM