Компилятор делает такие предположения, когда несколько классов объявляют методы с одинаковыми именами, которые возвращают разные типы. Поскольку ваша переменная "item" напечатана как "id", компилятор не знает, в какой из этих классов он будет отправлять сообщение во время выполнения, и выбирает один.
Чтобы избежать этой проблемы, вы можете сообщить компилятору, к какому классу относится «item», объявив его с определенным типом вместо общего «id»:
SomeItemClass *item;
Вы также можете избежать этого, не объявляя методы с одинаковыми именами, которые возвращают разные типы.