Переменные экземпляра в @interface; заголовок и реализация
Есть ли разница между объявлением переменной частного экземпляра в заголовке или объявлением ее в реализации?
в TestObj.h
@interface TestObj : NSObject
{
int test;
}
@end
vs в TestObj.m
@interface TestObj()
{
int test;
}
@end
Оба кажутся мне эквивалентными, есть ли какая-либо фактическая разница между объявлением переменной экземпляра в заголовке vs в реализации, если не предпочтительным? @interface
в файле реализации просто похоже на способ объявления частных свойств, имеет ли он какие-либо другие цели вне этого?
Ответы
Ответ 1
Предпочтение обычно заключается в том, чтобы помещать частные экземпляры и свойства в расширение частного класса (в .m) и оставить файл общедоступного интерфейса (.h) для тех свойств и методов, которые действительно являются частью открытого интерфейса.
Это помогает изолировать детали реализации от открытого интерфейса и делает все намного более чистым. Он также гарантирует, что внешние классы не будут непреднамеренно изменять частные переменные этого класса.
См. Расширения класса Расширение внутренней реализации.
Ответ 2
Комментарий Грега Паркера о принятом ответе - лучший ответ здесь:
Существует одно функциональное различие: ivars в классе @interface
по умолчанию @protected
, а ivars в расширении класса @interface или в @implementation
по умолчанию @private
.