Questo è qualcosa di molto affascinante che ho osservato oggi. Forse è così che funziona Objective-C ma non lo sapevo. Vedere il seguente codice:Problema con sottoclasse e superclasse con le stesse proprietà nominate
// ATableViewController.h
@interface ATableViewController : UITableViewController
@end
// ATableViewController.m
@interface ATableViewController()
@property (nonatomic) int volly;
@end
@implementation ATableViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.volly = 5;
}
@end
// BTableViewController.h
@interface BTableViewController : ATableViewController
@end
// BTableViewController.m
@interface BTableViewController()
@property (nonatomic) int volly;
@end
@implementation BTableViewController
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"%d", self.volly); // returns 5
}
@end
Non sono sicuro del motivo per cui quanto sopra è valido. Capisco che ho passato un messaggio 'volutamente' all'oggetto 'sé' che a sua volta probabilmente ha considerato il valore della super classe, ma non dovrebbe essere inizializzato? Qualche spiegazione sarebbe di grande aiuto. Grazie.
MODIFICA: Questo è un grosso problema IMO però. Considerando che non conosco nessuna delle proprietà private definite nella super classe, il mio insieme di valori potrebbe finire per essere diverso.
Ad esempio, uno sviluppatore può impostare un flag booleano hasAppeared
in viewDidAppear:
. Questo stesso valore verrà impostato per la mia istanza di sottoclasse in viewDidAppear:
dopo la chiamata [super viewDidAppear:]
. Questo avverrà prima che io possa realizzarlo da solo.
Attualmente, la soluzione è che conosco esattamente la variabile utilizzata dalla super classe e posso evitare di utilizzare lo stesso valore ma ritengo che questo sia un problema più ampio di quanto sembri.
MODIFICA 2: il comportamento è coerente con i file binari (con solo le intestazioni) e con i framework in cui è disponibile l'implementazione.
Anche io sono interessato a questa risposta, si prega di avvisare con un commento se qualcuno dice qualcosa di interessante :) –
Qual è la tua domanda? – Rog
"Perché quanto sopra è valido?" + 'Come non ottenere questo comportamento?' + 'Come evitare questo dato uno sviluppatore potrebbe non conoscere le proprietà private di una superclasse?' – p0lAris