Хорошо, после вашего разъяснения я постараюсь объяснить, что там происходит.
Допустим, у вас есть это в файле заголовка (.h):
@interface Foobar {
}
@property (readonly) int numberOfPies;
@end
Это определение общедоступного интерфейса class . В то время как я сказал «публичный» там, я хочу четко дать понять, что Objective-C не имеет той же концепции видимости, что и Java или C ++ (он использует ее для переменных экземпляра, но это самое дальнее, что я в курсе). Я также выделил «класс», потому что есть важное различие, подходящее. Еще одна вещь, на которую я хочу обратить внимание, это то, что класс публично объявляет numberOfPies
равным readonly
, поскольку это также будет важно.
Теперь давайте рассмотрим файл реализации (.m) для этого класса:
@interface Foobar ()
- (void) doSomething;
@property (readwrite) numberOfPies;
@end
@implementation Foobar
@synthesize numberOfPies;
- (void) doSomething {
NSLog(@"Doing something");
}
@end
Посмотрите на @interface Foobar ()
- начинается расширение класса . Это не объявление класса. Их также иногда называют частными категориями, анонимными категориями или продолжениями классов (согласно zneak в комментарии ниже), но важно знать, что они в основном являются своего рода категорией ( связан с документацией Apple по категориям). Они по существу определяют дополнительные методы и свойства и могут применяться к любому классу вообще. Они используются здесь для предоставления того, что составляет частный интерфейс для класса (отсюда и «частная категория»).
Двигаясь дальше, теперь мы сравним свойство numberOfPies
между классом и категорией. Если вы еще не заметили разницу, вот она: класс представляет ее как readonly
, категория расширяет ее и делает ее readwrite
внутри реализации. При синтезировании свойства Obj-C будет включать в себя как получатель, так и установщик, если это произойдет. Здесь важно то, что независимо от того, является ли ваша собственность readonly
или readwrite
, ваша собственность не может измениться. Он не может иметь атрибут assign
в классе и copy
в категории. Это в основном позволяет вам определить удобный частный установщик для свойств.
Здесь важно отметить одну вещь: абсолютно ничего в этой категории не является по-настоящему приватным. Ничто не может помешать вам отправить сообщение doSomething
объекту Foobar
, хотя компилятор выдаст вам предупреждение за пределами файла реализации класса.
После этого у вас есть стандартная реализация. Это включает в себя реализации методов в вашей анонимной категории.