Расширение класса Objective-C

Как довольно новый программист с целями (с 4-летним опытом работы с Java), мне, кажется, трудно понять, когда использовать расширения классов. Из того, что я понял (и, пожалуйста, поправьте меня, если я ошибаюсь), основное различие между категориями и расширениями состоит в том, что расширение ожидает, что вы реализуете методы внутри вашей основной реализации, тогда как с категорией это может быть в другой реализации. , Также кажется, что люди используют расширения в основном для частных методов.

Вот мой первый вопрос. В чем разница между использованием расширения класса для объявления закрытого метода, а не для его объявления вообще (кажется, что оно компилируется при запуске в обоих случаях)? (пример 1 против 2)

Пример 1

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

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

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

Пример 2

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

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

Второй вопрос: в чем разница между объявлением ivars внутри расширения и объявлением его непосредственно внутри реализации? (Пример 3 против 4)

Пример 3

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

@implementation Class
@end

Пример 4

@implementation Class
NSArray *mySortedArray;
@end

У меня последний вопрос о соглашениях по кодированию: когда я должен поставить подчеркивание (_) перед именем переменной?

Спасибо

Ответы на вопрос(5)

Ваш ответ на вопрос