Quando dichiaro un @property
in una superclasse senza dichiarare ivars, sottoclassi e cerco di implementare getter usando le superclasse ivar (_propertyName
) nella sottoclasse, xcode richiama un errore che indica Use of undeclared identifier '_propertyName'
.Dichiarare ivars nella superclasse o @synthesize nella sottoclasse?
Qual è la soluzione conforme alle migliori pratiche di programmazione?
Dovrei @synthesize propertyName = _propertyName
nel @implementation
della sottoclasse o
@interface SuperClass : AnotherClass
{
Type *_propertyName;
}
@property Type *propertyName;
@end
EDIT:
faccio capire la "sintesi" automatico dei metodi di accesso alle proprieta e la creazione di 'underbar Ivars' dal compilatore.
L'ivar è accessibile dall'implementazione di SuperClass
senza alcun @synthesize
o dichiarazione di ivars nell'interfaccia o nella sezione di implementazione.
ulteriore chiarimento del mio caso: Disclaimer: Contenuto rubati blocco di codice da Alfie Hanssen
@interface SuperViewController : UIViewController
@property (nonatomic, strong) UITableView * tableView; // ivar _tableView is automatically @synthesized
@end
#import "SuperViewController.h"
@interface SubViewController : SuperViewController
// Empty
@end
@implementation SubViewController
- (void)viewDidLoad
{
NSLog(@"tableView: %@", self.tableView); // this is perfectly OK
}
// ************* This causes problem **************
- (UITableView *) tableView {
if (!_tableView) { // Xcode error: Use of undeclared identifier '_propertyName'
_tableView = [[SubclassOfUITableView alloc] init];
}
return _tableView;
}
// ************************************************
@end
Questo è strano: in Objective C gli ivar sono protetti per impostazione predefinita, quindi le sottoclassi dovrebbero essere in grado di accedervi come se fossero le proprie. Come si accede a '_propertyName' per ottenere quell'errore? – dasblinkenlight
Se la vostra proprietà è '@property Tipo * _propertyName;' allora penserei che ivar sarebbe '__propertyName'. (Due trattini bassi) Perché la sottoclasse necessita di un accesso diretto a Ivar? – BergQuester
FYI, non c'è più bisogno di proprietà '@ synthesize'; basta dichiararli nel file di intestazione e la sintesi viene eseguita automaticamente da Xcode/il compilatore. – davidf2281