Не можете понять следующий код в цели C? - PullRequest
0 голосов
/ 02 июня 2011

Пожалуйста, используйте следующий код:

Имя файла: myclass.h

@interface myclass:NSObject
...
@end
@interface NSObject(CategoryName)
....
@end

Я не понимаю, как мы можем объявить 2 директивы @interface в одном файле .h? и, как и в файле реализации, мы можем реализовать только один из приведенных выше интерфейсов.

Имя файла: myclass.m

@implementation myclass
...
@end 

в приведенном выше коде я не могу написать @implementation Categoryname, поскольку имя файла .h - myclass. Как реализовать методы, описанные в категории.

Также может ли мой основной интерфейс расширить один класс, а категория, которую я определяю в том же файле .h, расширить другой класс?

Как я могу объявить один класс в другой класс (вложенный класс) в цели c?

Заранее спасибо.

UPDATE

После прочтения ответов у меня есть еще 2 вопроса

  1. если у меня есть 2 @interface в моем .h файле, могу ли я иметь 2 @implementation в .m файле.
  2. если у меня есть 2 @interface в моем файле .h и если я импортирую этот файл .h в другой файл, могу ли я получить доступ к методам обеих директив @interface?
  3. Могу ли я реализовать методы, объявленные в категории, в интерфейсе другого класса?

1 Ответ

4 голосов
/ 02 июня 2011

Добавьте это как еще одно объявление в тот же файл, как это

@implementation NSObject (categoryname)

...

@end

Все это описано в разделе Категории и расширения документации разработчика.

Поскольку вы расширяете другой класс в том же интерфейсе - вам нужно иметь отдельное объявление в файле реализации.

Отредактировано для ответа на дополнения:

  1. Да, я только что сказал.
  2. Да - интерфейсы предоставляют публичные методы.
  3. Где-то в вашем дереве компиляции у вас должен быть файл, который реализует методы, которые вы объявили в своей категории. Большинство людей определяют категории в своих собственных файлах с определенным соглашением об именах. Например, uliwitness / uikit . Для вашего примера это будет в NSObject+CategoryName.h и NSObject+CategoryName.m. После того, как вы объявили и определили категорию в классе, она становится доступной для всех объектов этого класса. Таким образом, поскольку вы добавляете расширение к NSObject, эти методы доступны всем классам, которые наследуются от NSObject (который является практически всеми классами) независимо от того, импортируете ли вы файл заголовка или нет. Но вы получите предупреждение компилятора, если вы не импортируете заголовок, даже если среда выполнения Objective C все еще позволит вызывать эти методы.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...