Rozszerzenie klasy Objective-C

Jako całkiem nowy programista C (z 4-letnim doświadczeniem w Javie) wydaje mi się, że trudno mi zrozumieć, kiedy używać rozszerzeń klas. Z tego, co zrozumiałem (i proszę, popraw mnie, jeśli się mylę), główna różnica między kategoriami a rozszerzeniami polega na tym, że rozszerzenie oczekuje, że zaimplementujesz metody w głównej implementacji, podczas gdy w kategorii może to być inna implementacja . Wydaje się również, że ludzie używają rozszerzeń głównie do prywatnych metod.

Oto moje pierwsze pytanie. Jaka jest różnica między używaniem rozszerzenia klasy do deklarowania metody prywatnej, a nie deklarowaniem jej w ogóle (wydaje się, że kompiluje się w obu przypadkach)? (przykład 1 vs 2)

Przykład 1

@interface Class()
-(void) bar;
@end

@implementation Class
-(void) foo {
    [self bar];
}

-(void) bar {
    NSLog(@"bar");
}
@end

Przykład 2

@implementation Class
-(void) foo {
    [self bar];
}

-(void) bar {
    NSLog(@"bar");
}
@end

Drugie pytanie: Jaka jest różnica między deklarowaniem ivars wewnątrz rozszerzenia a deklarowaniem go bezpośrednio w implementacji? (Przykład 3 vs 4)

Przykład 3

@interface Class() {
    NSArray *mySortedArray;
}
@end

@implementation Class
@end

Przykład 4

@implementation Class
NSArray *mySortedArray;
@end

Mam ostatnie pytanie dotyczące konwencji kodowania: kiedy powinienem umieścić podkreślenie (_) przed nazwą zmiennej?

Dziękuję Ci

questionAnswers(5)

yourAnswerToTheQuestion