title: Type-casting @property for concrete child class
body: <p>I am designing a abstract base class for a model, where one property of the base class is currently <code>id</code>. I'd like the concrete classes to define what this "content" property type is. Is it safe to redefine the property with a specific type for compiler checking?</p>
  
  <p>Base class <code>.h</code>:</p>
  
  <pre><code>@interface Foo : NSObject
  ...
  @property (nonatomic, strong) id content;
  @end
  </code></pre>
  
  <p>Concrete class <code>.h</code>:</p>
  
  <pre><code>@interface TextFoo : Foo
  ...
  @property (nonatomic, strong) NSString *content;
  @end
  </code></pre>
  
  <p>Concrete class <code>.m</code> now requires a <code>@synthesize</code> for <code>NSString *content</code>. Is this override safe to do, or are there unintended side effects? At some top level controller I will be using introspection for a collection of <code>Foo</code>s, so I'm really only looking for compiler checking on concrete classes.</p>
  
  <p><strong>Edit</strong>: Just to add some additional information, this does actually work (Xcode 5.0.2) with no warnings or errors from the compiler. The abstract base class can even assign an arbitrary object in a setter and the subclass setter/getter still works. </p>