ios objective-c cocoa private

ios - ¿Qué significa "@private" en Objective-C?



cocoa (3)

¿Qué significa @private en Objective-C?


Como dijo htw, es un modificador de visibilidad. @private significa que solo se puede acceder a ivar (variable de instancia) directamente desde una instancia de esa misma clase. Sin embargo, eso puede no significar mucho para ti, así que déjame darte un ejemplo. Usaremos los métodos de init de las clases como ejemplos, para simplificar. Voy a comentar en línea para señalar los puntos de interés.

@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; }

Entonces, para responder a su pregunta, @private protege a los usuarios del acceso mediante una instancia de cualquier otra clase. Tenga en cuenta que dos instancias de MyFirstClass podrían acceder a todos los archivos iv de cada uno directamente; se supone que, dado que el programador tiene el control total sobre esta clase directamente, usará esta habilidad sabiamente.


Es importante entender lo que significa cuando alguien dice que no puede acceder a una variable de instancia @private . La verdadera historia es que el compilador le dará un error si intenta acceder a estas variables en su código fuente. En versiones anteriores de GCC y XCode, solo recibiría una advertencia en lugar de un error.

De cualquier manera, en el tiempo de ejecución, todas las apuestas están apagadas. Un objeto de cualquier clase puede acceder a estos @private @protected @private y @protected . Estos modificadores de visibilidad solo dificultan la compilación del código fuente en un código de máquina que viola la intención de los modificadores de visibilidad.

¡No confíe en los modificadores de visibilidad de ivar para la seguridad! No proporcionan ninguna en absoluto. Son estrictamente para la aplicación en tiempo de compilación de los deseos del constructor de la clase.


Es un modificador de visibilidad: significa que solo se puede acceder a las variables de instancia declaradas como @private mediante instancias de la misma clase . Los miembros privados no pueden ser accedidos por subclases u otras clases.

Por ejemplo:

@interface MyClass : NSObject { @private int someVar; // Can only be accessed by instances of MyClass @public int aPublicVar; // Can be accessed by any object } @end

Además, para aclarar, los métodos son siempre públicos en Objective-C. Sin embargo, hay formas de "ocultar" las declaraciones de métodos; consulte esta pregunta para obtener más información.