Objective-C Language Custom getters and setters


The default property getters and setters can be overridden:

@interface TestClass

@property NSString *someString;


@implementation TestClass

// override the setter to print a message
- (void)setSomeString:(NSString *)newString {
    NSLog(@"Setting someString to %@", newString);
    // Make sure to access the ivar (default is the property name with a _ 
    // at the beginning) because calling self.someString would call the same
    // method again leading to an infinite recursion
    _someString = newString;

- (void)doSomething {
    // The next line will call the setSomeString: method
    self.someString = @"Test";


This can be useful to provide, for example, lazy initialization (by overriding the getter to set the initial value if it has not yet been set):

- (NSString *)someString {
    if (_someString == nil) {
        _someString = [self getInitialValueForSomeString];
    return _someString;

You can also make a property that computes its value in the getter:

@interface Circle : NSObject

@property CGPoint origin;
@property CGFloat radius;
@property (readonly) CGFloat area;


@implementation Circle

- (CGFloat)area {
    return M_PI * pow(self.radius, 2);