Sono stato incaricato di eliminare alcuni errori di Clang in un code base. Sono molto nuovo allo sviluppo dell'iPhone e all'Obiettivo C, ma ho trovato la maggior parte dei problemi banali ... questo mi ha comunque bloccato, quando sono sicuro che sia qualcosa di imbarazzante.Objective-C: variabile di istanza utilizzata mentre 'self' non è impostata ... ma è
da una classe ZAttributedString:
- (id)initWithAttributedString:(ZAttributedString *)attr {
NSParameterAssert(attr != nil);
if ((self = [super init])) {
_buffer = [attr->_buffer mutableCopy];
_attributes = [[NSMutableArray alloc] initWithArray:attr->_attributes copyItems:YES];
}
return self;
}
L'avvertimento è clang "variabile istanza utilizzato po 'sé' non è impostato il risultato di '[super o auto] init ...]', con il dereferencing dell'attributo _buffer di attr essere evidenziata
Se aiuta, l'avvertimento sembra anche di ricordare che il problema si trova quando si chiama questo metodo:.
- (id)copyWithZone(NSZone *)zone {
return [(ZAttributedString *)[ZAttributedString allocWithZone:zone] initWithAttributedString:self];
}
Can Qualcuno, per favore, spiegami qual è esattamente il difetto qui?
TIA!
In realtà, questo codice proviene dalla classe 'ZAttributedString', quindi è perfettamente corretto utilizzare' -> 'per accedere a ivars da un'altra istanza della stessa classe. Questo è appropriato in tale codice quando si sta fondamentalmente creando un "costruttore di copie". – rmaddy
Non proprio corretto, anche in questo caso. * Se * fosse il metodo '-copy' stesso, allora * forse * (anche se questo è davvero un problema nella storia di ObjC -' NSCopyObject() 'non ha causato alcuna fine al dolore). Ma non nel DI. La classe può avere una logica sui getter che fanno qualcosa e questa istanza in-bound potrebbe molto probabilmente essere una sottoclasse con comportamenti sconosciuti. – bbum
@bbum: "L'attr in arrivo può essere un'istanza ZAttributedString o un'istanza di una sottoclasse" self "potrebbe anche essere un'istanza di una sottoclasse, quindi con tale argomento non è possibile accedere alle variabili di istanza, che ovviamente non è vero. – user102008