#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
.