¿Qué significa @private
en Objective-C?¿Qué significa "@private" en Objective-C?
Respuesta
Es un modificador visibilidad -es significa que las variables de instancia declaradas como @private
sólo se puede acceder por instancias de la misma clase. No se puede acceder a los miembros privados 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, métodos son siempre públicos en Objective-C. Sin embargo, hay formas de "ocultar" declaraciones de métodos; consulte this question para obtener más información.
¿Qué pasa con las variables de instancia que están en los corchetes después de @implementation? ¿Son siempre privados? –
Sé que es viejo ... Pero no es un modificador de visibilidad. Es un modificador de acceso. Es una distinción más importante en C++, pero también es una distinción en Objective-C. La variable es visible para el compilador. El compilador simplemente no te deja acceder a él. – gnasher729
Como dijo htw, es un modificador de visibilidad. @private
significa que la ivar (variable de instancia) solo se puede acceder directamente desde dentro de 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 init
de las clases como ejemplos, por simplicidad. Voy a comentar en línea para señalar los elementos 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;
}
Así que para responder a su pregunta, @private protege Ivars de acceso de una instancia de cualquier otra clase. Tenga en cuenta que dos instancias de MyFirstClass podrían acceder a todos los ivars de cada uno directamente; se supone que dado que el programador tiene el control completo sobre esta clase directamente, usará esta habilidad sabiamente.
Cabe mencionar que no es común utilizar @public, @proteced y @private en Objective-C. El enfoque preferido es usar siempre los descriptores de acceso. –
BJ, esta es la respuesta más sucinta y útil a esta pregunta que he visto. Muy bien puesto. – MikeyWard
@Georg, pero ¿cómo se exige el uso de accesorios a menos que marque sus ivars con visibilidad restringida? –
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 tiempo de ejecución, todas las apuestas están desactivadas. Se puede acceder a estos ivars @private
y @protected
por un objeto de cualquier clase. Estos modificadores de visibilidad simplemente dificultan la compilación del código fuente en el código máquina que infringe la intención de los modificadores de visibilidad.
¡No confíe en los modificadores de visibilidad de ivar para seguridad! No proporcionan ninguno en absoluto. Son estrictamente para la aplicación en tiempo de compilación de los deseos del generador de clase.
- 1. ¿Qué significa "?" significa en Java?
- 2. ¿Qué significa '??' significa en C#?
- 3. ¿qué significa "$ &" significa en Ruby
- 4. Bloques ObjectiveC equivalente en Java
- 5. ¿Qué es Object :: private y Object :: public en Ruby?
- 6. ¿Qué significa "privado" en Groovy?
- 7. ¿Qué significa [opt] en MSIL?
- 8. ¿Qué significa "babosa" significa
- 9. ¿Qué significa Field.Index.NOT_ANALYZED_NO_NORMS significa
- 10. ¿Qué significa ('../') significa?
- 11. Ruby Matrix set_element private?
- 12. qué significa global :: C#
- 13. ¿Qué significa @ "../ .." en una ruta?
- 14. ¿Qué significa: = mean en vb.net?
- 15. ObjectiveC Parse Integer from String
- 16. ¿Qué significa este colón (:)?
- 17. Private Static Readonly Field Capitalization
- 18. ¿Qué significa final en Groovy
- 19. ¿Qué significa "1"? significa en Perl?
- 20. ¿Qué significa "% .6d" significa en printf
- 21. ¿Qué significa @! significa en un De declaración
- 22. ¿Qué significa '$?' significa en scripts bash?
- 23. ¿Qué significa "rc" significa en archivos punto
- 24. java.lang.IllegalStateException ¿qué significa?
- 25. ¿Qué significa "if (stage) init();" significa en ActionScript?
- 26. ¿Cuándo y por qué usas @interface ClassName (Private)? - Objective-C
- 27. ¿Qué significa $ _ en PowerShell?
- 28. ¿Qué significa ~ en C++?
- 29. ¿Qué significa @@ en Ruby?
- 30. ¿Qué significa "\" en Perl?
¡Esta pregunta se discutió en el podcast # 53! (https://stackoverflow.blog/2009/05/14/podcast-53/) – DaveInCaz