#objective-c
#objective-c
Вопрос:
Пожалуйста, обратитесь к следующему коду:
Имя файла: myclass.h
@interface myclass:NSObject
...
@end
@interface NSObject(CategoryName)
....
@end
Я не понимаю, как мы можем объявить 2 директивы @interface в одном и том же файле .h? и, как и в файле реализации, мы можем реализовать только одно из вышеперечисленных interfaces.eg .
Имя файла: myclass.m
@implementation myclass
...
@end
в приведенном выше коде я не могу написать @implementation Categoryname, поскольку имя файла .h равно myclass . Как мне реализовать методы, описанные в категории.
Также может ли мой основной интерфейс расширить один класс, а категория, которую я определяю в том же файле .h, расширить другой класс?
Как я могу объявить один класс в другом классе (вложенный класс) в objective c?
заранее благодарю вас.
Обновить
После прочтения ответов у меня есть еще 2 вопроса
- если у меня есть 2 @interface в моем файле .h, могу ли я иметь 2 @ implementation в файле .m?
- если у меня есть 2 @interface в моем файле .h и если я импортирую этот файл .h в другой файл, могу ли я получить доступ к методам в соответствии с обеими директивами @interface?
- Могу ли я реализовать методы, объявленные в категории, в интерфейсе другого класса?
Ответ №1:
Добавьте его в качестве другого объявления в тот же файл, вот так
@implementation NSObject (categoryname)
...
@end
Все это описано в разделе Категорий и расширений документации разработчика.
Поскольку вы расширяете другой класс в том же интерфейсе — вам необходимо иметь отдельное объявление в файле реализации.
Отредактировано, чтобы ответить на дополнения:
- Да — я только что так сказал.
- Да — Интерфейсы предоставляют общедоступные методы.
- Где-то в вашем дереве компиляции у вас должен быть файл, который реализует методы, которые вы объявили в своей категории. Большинство людей определяют категории в своих собственных файлах с определенным соглашением об именовании.Например, uliwitness / uikit. Для вашего примера это было бы в
NSObject CategoryName.h
иNSObject CategoryName.m
. Как только вы объявили и определили категорию в классе, она становится доступной для всех объектов этого класса. Итак, поскольку вы добавляете расширение к NSObject , эти методы доступны для всех классов, которые наследуются от NSObject (а это практически все классы), независимо от того, импортируете вы файл заголовка или нет. Но вы получите предупреждение компилятора, если не импортируете заголовок, даже несмотря на то, что среда выполнения Objective-C по-прежнему разрешает вызывать эти методы.
Комментарии:
1. Категория находится в вопросе NSObject
2. @JeremyP — Ta. Я был слишком зациклен на бите myclass.
3. итак, какое это имеет значение, если категория находится в NSObject?
4. это имеет значение только для способа объявления реализации. Категория расширяет класс — поэтому вам нужно указать класс в объявлении.
5. Ответил. Прежде чем вы еще немного подумаете об этом — ознакомьтесь с документацией, на которую я дал ссылку. Там есть примеры и более глубокое объяснение, чем я могу дать здесь.