title: Why does a subclass @property with no corresponding ivar hide superclass ivars?
body: <p>The following seems simple enough. There's a superclass with an ivar, and a subclass which accesses the (@protected) superclasses ivar:</p>
  
  <pre><code>// Testclass.h    
  @interface TestClass : NSObject {
      NSString *testIvar;
  }
  @end
  
  //TestClass.m
  @implementation TestClass
  @end
  
  //TestSubclass.h
  @interface TestSubClass : TestClass {
  }
  
  @property (nonatomic, retain) NSString *testProperty;
  - (void) testMethod;
  
  @end
  
  //TestSubclass.m    
  #import "TestSubClass.h"
  @implementation TestSubClass
  
  @synthesize testProperty;
  
  - (void) testMethod{
      NSLog(@"The value was: %@", testIvar);
  }
  @end
  </code></pre>
  
  <p>Simple and correct-seeming enough. However, attempting to compile (for iOS 4.2 SDK, with GCC 4.2) produces this error pointing to the NSLog line: 'testIvar undeclared'.</p>
  
  <p>I'm new to Objective-C, but can't for the life of me see why this should be an error. Comment out the testProperty stuff, and it compiles OK. It seems like adding a synthesized property in a subclass, without a corresponding ivar, is actually hiding an unrelated superclass ivar.</p>
  
  <p>Can anyone enlighten me as to what's happening here? Relatedly, was the compilation error foreseeable? (Foreseeing it would have saved me some time and frustration).</p>