Они на самом деле не взаимозаменяемы (в некоторых случаях это нормально). Получите доступ к ivar напрямую, когда это то, что вам нужно, и используйте методы доступа, когда это то, что вам нужно. Вероятно, это будет зависеть от иерархии классов, реализации класса, безопасности потока кода и т. Д. И т. Д.
Все, что в значительной степени зависит от вас, если это ваш код. Возможно, кто-то захочет создать подкласс этого класса и написать пользовательскую реализацию -foobar, которая всегда возвращала @ "BOO", но они обнаружили, что метод superClass -printFooBar теперь печатает @ "hello darling", потому что он выводит значение переменной foobar вместо значение, возвращаемое из self.foobar?
Вызов метода доступа имеет больше накладных расходов, чем непосредственное использование переменной, но нужно учитывать больше вещей, чем производительность. Лично я нахожу позицию «всегда использовать метод доступа» такой же нелепой, как высказывание «никогда не использовать методы доступа» - что, безусловно, было бы нелепо.