Cosa @private
significa in Objective-C?
Cosa @private
significa in Objective-C?
Risposte:
È un modificatore di visibilità: significa che le variabili di istanza dichiarate come @private
sono accessibili solo da istanze della stessa classe . Ai membri privati non è possibile accedere da sottoclassi o altre classi.
Per esempio:
@interface MyClass : NSObject
{
@private
int someVar; // Can only be accessed by instances of MyClass
@public
int aPublicVar; // Can be accessed by any object
}
@end
Inoltre, per chiarire, i metodi sono sempre pubblici in Objective-C. Ci sono modi di "nascondere" le dichiarazioni dei metodi, però: vedi questa domanda per maggiori informazioni.
Come ha detto htw, è un modificatore di visibilità. @private
significa che è possibile accedere a ivar (variabile di istanza) direttamente dall'interno di un'istanza di quella stessa classe. Tuttavia, ciò potrebbe non significare molto per te, quindi lascia che ti faccia un esempio. Useremo i init
metodi delle classi come esempi, per semplicità. Commenterò in linea per indicare elementi di interesse.
@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;
}
Quindi, per rispondere alla tua domanda, @private protegge gli ivar dall'accesso di un'istanza di qualsiasi altra classe. Si noti che due istanze di MyFirstClass potrebbero accedere direttamente a tutti gli altri Ivar; si presume che, poiché il programmatore ha il controllo completo completo su questa classe, utilizzerà saggiamente questa capacità.
@private
il modello per un oggetto, non è più così raro.
@implementation
blocco. E una volta che lo fai, sono effettivamente privati, indipendentemente dai modificatori di visibilità, in quanto non sono nemmeno visibili a nessuno al di fuori di quel file.
È importante capire cosa significa quando qualcuno afferma che non è possibile accedere a una @private
variabile di istanza. La vera storia è che il compilatore ti darà un errore se provi ad accedere a queste variabili nel tuo codice sorgente. Nelle versioni precedenti di GCC e XCode, avresti semplicemente ricevuto un avviso invece di un errore.
Ad ogni modo, in fase di esecuzione, tutte le scommesse sono disattivate. Questi @private
e gli @protected
ivar sono accessibili da un oggetto di qualsiasi classe. Questi modificatori di visibilità rendono difficile la compilazione del codice sorgente in codice macchina che viola l'intento dei modificatori di visibilità.
Non fare affidamento sui modificatori di visibilità Ivar per la sicurezza! Non forniscono affatto. Sono rigorosamente per l'applicazione in fase di compilazione dei desideri del costruttore di classi.