Some notes that help when subclassing a class and can’t remember how things work:
Assign from broad to narrow works however from narrow to broad is usually an error.For example, an Animal is broad – it’s very generic. However, a Cow is very narrow – it has a very specific definition.
Here’s an example:
Cow *cow = [Animal alloc] init];
is OK as a cow can respond to all Animal messages.
Animal *animal = [[Cow alloc] init];
is NOT ‘cos animal cannot respond to Cow messages (such as moo) and will crash.
So, it’s OK to assign from broad to narrow:
Cow *cow = animal;
but not narrow to broad:
Animal *animal = cow; // bad – will crash
One note: id is special. It’s OK to assign to it in both broad and narrow cases.
So, to summarise:
broad to narrow: OK
narrow to broad: usually an error
And, if you’re going to use id, use Introspection or Protocols.