Синтезированный ивар совершенно невидим для всего кода, который не может видеть строку @synthesize
(что в основном означает что-либо вне файла .m).Это не @protected
, это не @private
, это просто неизвестно.При использовании @private
ivar другому коду, пытающемуся получить к нему доступ, будет сообщено, что он является закрытым, но при использовании синтезированного ivar другому коду, пытающемуся получить к нему доступ, будет сказано, что поле просто не существует.В качестве мысленного эксперимента попробуйте представить ситуацию, когда ивар действовал так, как будто он был @protected
.Вы делаете подкласс, и вы бредите там с помощью ивара.Теперь вернитесь в суперкласс и измените @synthesize myProp
на @synthesize myProp=foo
.Что происходит в подклассе?Когда компилятор обрабатывает подкласс, он не может видеть строку @synthesize
, поэтому он не будет знать, что вы просто изменили имя ivar.На самом деле, он даже не может сказать, поддерживается ли свойство иваром вообще, или реализовано ли оно с помощью пользовательских методов доступа.Я надеюсь, очевидно, почему это означает, что подкласс не может получить доступ к ivar, как и любой другой класс.
Тем не менее я не совсем уверен, что делает компилятор, если вы пишете код в том же самом.m файл, который пытается получить доступ к ivar.Я ожидаю, что он будет рассматривать ивар как @private
(поскольку компилятор фактически может видеть, что ивар существует).
Кроме того, ни одно из этого не имеет никакого отношения к методам времени выполнения.Другие классы могут по-прежнему использовать методы времени выполнения obj-c для динамического поиска списка иваров вашего класса и его использования.