Zostałem poproszony o wyczyszczenie niektórych błędów Clang w bazie kodu. Jestem nowicjuszem w rozwoju iPhone'a i Celu C, ale większość problemów jest banalnych ... ten jednak mnie denerwuje, kiedy jestem pewien, że jest to coś krępującego.Objective-C: Zmienna instancji używana, gdy "self" nie jest ustawione ... ale jest
z klasy 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;
}
Ostrzeżenie dzyń jest „zmienna instancji wykorzystywane podczas gdy«ja»nie jest ustawiony na skutek«[SUPER lub jaźni] Init ...]», z dereferencing atrybutu _buffer atr za podświetlonego
Jeśli to pomoże, ostrzeżenie wydaje się również, aby wspomnieć, że problem występuje, gdy dzwonisz z tej metody.
- (id)copyWithZone(NSZone *)zone {
return [(ZAttributedString *)[ZAttributedString allocWithZone:zone] initWithAttributedString:self];
}
Can Proszę mi wyjaśnić, kim dokładnie jest ta wada?
TIA!
Właściwie ten kod pochodzi z klasy 'ZAttributString', więc jest całkowicie poprawne użycie' -> 'do dostępu do ivars z innej instancji tej samej klasy. Jest to odpowiednie w takim kodzie, gdy zasadniczo tworzysz "konstruktora kopiowania". – rmaddy
Niezupełnie, nawet w tym przypadku. * Jeśli * była to sama metoda '-copy', to * może * (nawet to jest naprawdę ostra krawędź w historii ObjC -' NSCopyObject() 'nie spowodowało końca bólu). Ale nie w DI. Klasa może mieć logikę dla modułów pobierających, które coś wykonują, a ta wbudowana instancja może bardzo prawdopodobnie być podklasą z nieznanymi zachowaniami. – bbum
@bbum: "Przychodzące attr może być instancją ZAttributedString lub instancją podklasy" self "może również być instancją podklasy, więc przez ten argument nie można uzyskać dostępu do zmiennych instancji, co oczywiście nie jest prawdą. – user102008