Home | About | Apps | Rss

Accessing Objective-C properties internally

13 Jun 2014

Inside an objective class, there are 2 ways to access any declared property

  • self.propertyName
  • _propertyName Although both the uses hypothetically have the similar effect, there are 3 distinct differences
  1. self.propertyName trigggers the setter, which is important if you are performing any additional operations or validations. This does not happen when accessing the ivar directly

  2. self.propertyName also triggers KVO Notifications which _propertyName conveniently ignores.

  3. Accesing property also gives access to various memory management features for free. Eg: a property with copy attribute will enforce it by creating a copy of the instance being assigned rather than just assigning the pointer, which is particularly useful when assinging mutable data to immutable property type.


@interface ViewController ()
@property (nonatomic, strong) NSString *theName;

- (void)viewDidLoad 
    [super viewDidLoad];
    [self addObserver:self

    self.theName = @"Hello world";	// Triggers KVO
    _theName = @"Fancy world";		// No KVO


- (void)observeValueForKeyPath:(NSString *)keyPath
                        change:(NSDictionary *)change
                       context:(void *)context
    NSLog(@"Key path changed - %@", change);


Notice only one of the 2 assignments triggers KVO notification

2014-06-13 06:03:56.163 NotifTest[24710:1356234] Key path changed - {
    kind = 1;
    new = "Hello world";

Setting up Core Data | | Drawing lines and circles using CoreGraphics