0

Assume всех следующего кода записывается в файле реализация .Could кто-нибудь объяснить разницу между:Ивара против расширения класса

#1 

    @interface ViewController() 
    @property (nonatomic) NSDictionary *currentAlbumData; 
    @end 

    @implementation ViewController 

#2 
    @interface ViewController() { 
    NSDictionary *currentAlbumData; 
    } 
    @end 

    @implementation ViewController 

#3 
    @interface ViewController 
    @end 

    @implementation ViewController { 
    NSDictionary *currentAlbumData; 
    } 

    - some methods here - 
    @end 

так, как я это вижу, первый один объявляет переменные свойства в классе расширение. Второй объявляет переменную экземпляра в расширении класса. Третий объявляет переменную экземпляра, которая не является расширением класса ... что это подразумевает? Как это сравнить с просто объявлением ivar в расширении класса?

ответ

0

Разница между свойством и переменными экземпляра должна быть очевидной.

Разница между определением ivar в расширении и внедрением является одной из видимости. Хотя частные расширения, например, включенные в ваш пост, обычно записываются в том же файле, что и в реализации, они не обязательно должны быть. Интерфейсы могут быть определены где угодно, и все расширения, видимые компилятору/компоновщику, сводятся вместе в одно определение класса во время сборки.

+0

Вопрос о видимости для СЕБЯ? Как я могу видеть расширенные переменные прямо там в том же файле, или переходить к другому файлу в другом месте? Не очень понятно. Кроме того, это не вопрос масштаба (как в области файлов и глобальной области)? –

+0

Переменная экземпляра, определенная в разделе '@ interface', видна любому коду, который ее видит. Не имеет значения, является ли этот '@ interface' расширением или основным. – Avi