Я добавлю два своих цента к этому старому вопросу.
Я думаю, что @private
, @protected
также существует для предотвращения доступа к переменной с помощью оператора '->.
Представьте, что у вас есть iVar с именем myPrivateVar
, объявленный какниже:
@interface MyClass:NSObject{
@public
NSArray *myPrivateVar;
}
Таким образом, даже если вы реализуете метод класса ниже, чтобы вернуть NO
, и у вас нет объявленных методов доступа для iVar:
+accessInstanceVariablesDirectly{
return NO;
}
переменная по-прежнему доступнаесли вы используете myClassObj->myPrivateVar
;
С другой стороны, если вы просто сделаете от @public
до @private
и не реализуете accessInstanceVariableDirectly
, переменная по-прежнему доступна дляиспользуя KVC:
[myClassObj valueForKey:@"myPrivateVar"];
(и не доступен через myClassObj->myPrivateVar
)
Поэтому, чтобы сделать ваш iVar полностью приватным, он должен быть объявлен как @private
, а также должен быть реализован accessInstanceVariablesDirectly
вернуть NO
.