Probably this is because SomeObject
is something more than just id<A>
. It's like initialising an object of derived class with pointer to the base class. You can initialize an instance of id<A>
with SomeObject
but when you do it vice versa you're receiving a warning, which says :"Hey, buddy you've just assigned base to derived, i.e. something that is present in derived (SomeObject *)
may be missed in base id<A>
"
for example SomeObject
may contain method foo
which is not present in protocol A
, but now after that assignment of yours if you send foo
message to obj
it may crash, because id<A>
is not necessarily has this method. It can, if it's also an instance of SomeObject
, but it can be anything, which NECESSARILY responds only to the methods declared in A
.
I hope all this makes sense