Переменные экземпляра в @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.