Что означает "@private " в Objective-C?
что значит @private
означает в Objective-C?
3 ответа:
Это видимости модификатор-это означает, что переменные объявлены как
@private
могут быть доступны только экземпляры одного класса. Частные члены не могут быть доступны подклассами или другими классами.например:
@interface MyClass : NSObject { @private int someVar; // Can only be accessed by instances of MyClass @public int aPublicVar; // Can be accessed by any object } @end
кроме того, чтобы уточнить, методы всегда являются общедоступными в Objective-C. Есть способы "скрывать" объявления методов, хотя-см. этот вопрос для получения дополнительной информации.
как сказал htw, это модификатор видимости.
@private
означает, что ivar (переменная экземпляра) может быть доступна только непосредственно из экземпляра того же класса. Тем не менее, это может не много значить для вас, поэтому позвольте мне привести вам пример. Мы будем использоватьinit
методы классов, в качестве примера, для простоты. Я прокомментирую inline, чтобы указать на интересные элементы.@interface MyFirstClass : NSObject { @public int publicNumber; @protected // Protected is the default char protectedLetter; @private BOOL privateBool; } @end @implementation MyFirstClass - (id)init { if (self = [super init]) { publicNumber = 3; protectedLetter = 'Q'; privateBool = NO; } return self; } @end
@interface MySecondClass : MyFirstClass // Note the inheritance { @private double secondClassCitizen; } @end @implementation MySecondClass - (id)init { if (self = [super init]) { // We can access publicNumber because it's public; // ANYONE can access it. publicNumber = 5; // We can access protectedLetter because it's protected // and it is declared by a superclass; @protected variables // are available to subclasses. protectedLetter = 'z'; // We can't access privateBool because it's private; // only methods of the class that declared privateBool // can use it privateBool = NO; // COMPILER ERROR HERE // We can access secondClassCitizen directly because we // declared it; even though it's private, we can get it. secondClassCitizen = 5.2; } return self; }
@interface SomeOtherClass : NSObject { MySecondClass *other; } @end @implementation SomeOtherClass - (id)init { if (self = [super init]) { other = [[MySecondClass alloc] init]; // Neither MyFirstClass nor MySecondClass provided any // accessor methods, so if we're going to access any ivars // we'll have to do it directly, like this: other->publicNumber = 42; // If we try to use direct access on any other ivars, // the compiler won't let us other->protectedLetter = 'M'; // COMPILER ERROR HERE other->privateBool = YES; // COMPILER ERROR HERE other->secondClassCitizen = 1.2; // COMPILER ERROR HERE } return self; }
поэтому, чтобы ответить на ваш вопрос, @private защищает ивары от доступа экземпляром любого другого класса. Обратите внимание, что два экземпляра MyFirstClass может получить доступ ко всем друг друга Иварс напрямую; предполагается, что, поскольку программист имеет полный контроль над этим классом напрямую, он будет разумно использовать эту способность.
важно понять, что это значит, когда кто-то говорит, что вы не можете получить доступ к
@private
переменной экземпляра. Реальная история заключается в том, что компилятор даст вам ошибку, если вы попытаетесь получить доступ к этим переменным в исходном коде. В предыдущих версиях GCC и XCode вы просто получите предупреждение вместо ошибки.в любом случае, во время выполнения все ставки выключены. Эти
@private
и@protected
ивары могут быть доступны с помощью объекта любого класса. Эти видимости модификаторы просто затрудняют компиляцию исходного кода в машинный код, который нарушает намерение модификаторов видимости.не полагайтесь на модификаторы видимости ivar для обеспечения безопасности! Они вообще ничего не дают. Они предназначены исключительно для выполнения во время компиляции пожеланий строителя классов.