Объявление переменных в @implementation

#objective-c #class #scope #variable-declaration

#objective-c #класс #область видимости #объявление переменной

Вопрос:

Я видел пример в книге, показывающий этот код:

 @implementation ViewController
{
    NSString *name;
}
 

Почему бы не объявить это в @interface ? В чем разница в объявлении переменных @implementation вместо @interface ? Зачем объявлять это NSString в области видимости?

Ответ №1:

Преимуществом объявления ivar в @implementation разделе является лучшая инкапсуляция. Таким образом, ивары не должны отображаться в .h файле и, следовательно, не видны внешним пользователям вашего класса, которые видят только файл заголовка. Это лучше скрывает внутреннюю реализацию класса.

Вообще говоря, теперь, когда свойства могут иметь автоматически синтезируемые ivar, а другие ivar могут быть объявлены непосредственно в @implementation блоке, я не вижу причин, по которым вы вообще должны объявлять ivar в вашем @interface (кроме обратной совместимости).

Зачем объявлять эту NSString в области видимости?

Потому что это единственный способ объявить переменную экземпляра. В противном случае вы бы объявили переменную, доступ к которой можно получить из любого места в том же файле (см. Вопрос, на который BoltClock ссылается в своем комментарии).

Комментарии:

1. Итак, если я объявлю, что NSString выходит за рамки, станет ли она глобальной переменной? Я имею в виду, что любые внешние классы могут получить доступ к переменной?

2. Вроде того; см. Вопрос, который некоторые считали обманом, поскольку он охватывает разницу между ivar и глобальными / статическими значениями. Обратите внимание, что объявления ivar в @implementation является относительно новым — это было невозможно в 32-разрядной среде выполнения Mac OS X из-за способа, которым компилятор генерирует классы. Как только проблема «хрупкого базового класса» была решена, стало возможным выполнять автосинтез и / или объявлять переменные вне основного @interface .