Extensão de classe Objective-C

Como um programador objetivo-c razoavelmente novo (com uma experiência Java de 4 anos), parece que estou tendo dificuldades em entender quando usar extensões de classe. Pelo que eu entendi (e por favor, me corrija se eu estiver errado), a principal diferença entre as categorias e extensões é que a extensão espera que você implemente os métodos dentro de sua implementação principal, enquanto que com uma categoria, ela pode estar em outra implementação . Parece também que as pessoas estão usando extensões principalmente para métodos privados.

Aqui está minha primeira pergunta. Qual é a diferença entre usar uma extensão de classe para declarar um método privado e não declará-lo (parece compilar em execução nos dois casos)? (exemplo 1 vs 2)

Exemplo 1

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

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

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

Exemplo 2

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

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

Segunda pergunta: Qual é a diferença entre declarar ivars dentro da extensão e declará-la diretamente dentro da implementação? (Exemplo 3 vs 4)

Exemplo 3

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

@implementation Class
@end

Exemplo 4

@implementation Class
NSArray *mySortedArray;
@end

Eu tenho uma última pergunta sobre convenções de codificação: quando devo colocar um sublinhado (_) na frente do nome de uma variável?

Obrigado

questionAnswers(5)

yourAnswerToTheQuestion