title: Objective-C - Private vs Protected vs Public
body: <p>I am hoping for some clarification on how Private vs Protected vs Public works with respect to class members when programming in Objective-C - I thought I knew the difference (I've added some comments to my parent class Person with respect to the same), but the fact that the compiler did not complain when I tried to access a private ivar/member of a parent class via the subclass now has me confused.</p>
  
  <p><strong>Here is my Parent Class:</strong></p>
  
  <pre><code>/*
   Person.h
  */
  
  #import &lt;Foundation/Foundation.h&gt;
  
  @interface Person : NSObject 
  {
      //We can also define class members/iVars that are of type private
      //This means they can only be accessed by the member functions
      //of the class defining them and not subclasses
      @private
      int yob;    
  
      //We can also define class members/iVars that are of type public
      //Public members can be accessed directly
      @public
      bool alive;
  
      //By default class members/iVars are of type protected
      //This means they can only be accessed by a class's own
      //member functions and subclasses of the class and typically
      //also by friend functions of the class and the subclass
      //We can explicitly define members to be protected using the
      //@protected keyword
  
      @protected
      int age;
      float height;   
  
  }
  @property int age;
  @property float height;
  @property int yob;
  @property bool alive;
  
  @end
  </code></pre>
  
  <p><strong>Here is my derived class Man:</strong></p>
  
  <pre><code>    /*
       Man - Subclass of Person
      */
  
      #import &lt;Foundation/Foundation.h&gt;
      #import "Person.h"
  
      @interface Man : Person
      {
          //iVar for Man
          float mWeight;
      }
      @property float mWeight;
  
      @end
  </code></pre>
  
  <p><strong>And finally, here is main:</strong></p>
  
  <pre><code>#import &lt;Foundation/Foundation.h&gt;
  #import "Person.h"
  #import "Man.h"
  
      int main (int argc, const char * argv[]) 
          {
              NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  
              //Create a Person object
              Person * aPerson = [[Person alloc]init];
  
              //Create a Man object
              Man * aMan = [[Man alloc]init];
  
              //Let's attempt to modify our Person class members
              aPerson.height = 5.11; //Protected
              aPerson.age = 21; //Protected
              aPerson.yob = 2010; //Private
              aPerson.alive = YES; //Public
  
              //Let's now attempt to modify the same members via our
              //derived class Man - in theory, the private members should
              //not be accessible by the derived class man
              aMan.height = 6; //Protected
              aMan.age = 26; //Protected
              aMan.yob = 2011; //Private
              aMan.alive = YES; //Public
              aMan.mWeight = 190; //Protected member of Man Class
  
              [pool drain];
              return 0;
          }
  </code></pre>
  
  <p>Shouldn't the compiler complain why I try to access aMan.yob above? Or by using @property &amp; @synthesize (i.e. the setter and getter methods) have I essentially made that member protected and therefore accessible to the subclass?</p>