Несколько объявлений @interface, сгенерированные XCode для NSViewController?

StackOverflow https://stackoverflow.com//questions/23022755

Вопрос

Я делаю приложение какао и используя Xcode для различного поколения кода.Работает нормально для генерации файлов .h и .m для подклассов UIView, но когда я подкласс UiviewController, я получаю объявление @interface, идентично в обоих файлах, за исключением того, что в файле .m он имеет ( ) в конце:

//in MyViewController.h
@interface MyViewController : NSViewController <MyViewDelegate>

@end
.

Но также

//in MyViewController.m
@interface MyViewController ()

@end

@implementation MyViewController

@end
.

все же он компилируется нормально.Итак, предположить, что это нормальное поведение, две части вопроса: (А) Почему это происходит, и (B) Каковы результаты - особенно с точки зрения заказа компиляции?

Спасибо!

Это было полезно?

Решение

Когда я подкласс UiviewController, я получаю объявление @interface, идентичное в обоих файлах, за исключением того, что в файле .m он имеет ()

Как вы заметили, два интерфейсных блока являются не идентичным - генеракодицетагкод важен.Один с () - это расширение класса , которое похоже на категорию без имени.Два важных различия между категорией и расширением класса являются:

  1. Вы можете объявить переменные экземпляра в расширении класса, но вы не можете в категории.

  2. Расширение класса должно отображаться в том же файле, что и блок реализации.

  3. Расширения классов

    полезны для объявления переменных экземпляров и способов, которые вы не хотите выставлять в заголовочном файле, например, методы или переменные, которые специфики для реализации, и не следует полагаться на пользователей класса.

Другие советы

Вы знакомы с категориями?То, что вы наблюдаете, похоже, но имеет важные различия из категорий.Различие вот в том, что он анонимный (отсюда, пустые парунки) и скомпилирован одновременно изначальный класс скомпилирован.Эта более поздняя часть является важной частью: это означает, что вы можете добавить свойства экземпляра (хранилище).Это чаще всего используется для объявления «внутренних только» или «частных» методов и свойств.Но имейте в виду, что во время выполнения нет понятия «частного» исполнения, это все о том, какой интерфейс вы опубликовали, а не опубликован.Это всего лишь один из способов иметь очень четко определенный интерфейс, который является только «опубликованным» людям, которые авторут файл реализации основного класса.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top