Почему существует @interface над @implementation?
Мне интересно, почему существует два раза @interface
. Один в class.h
и другой в class.m
. Например:
TestTableViewController.h
:
#import <UIKit/UIKit.h>
@interface TestTableViewController : UITableViewController
@end
и (автоматически сгенерировано) class.m
я find:
#import "TestTableViewController.h"
@interface TestTableViewController ()
@end
@implementation TestTableViewController
... methods delegated from UITable delegates
@end
Итак, мой вопрос в том, что такое @interface TestTableViewController ()
в файле .m
. Почему он там? Мне это нужно?
Заранее спасибо
Ответы
Ответ 1
Вторая директива @interface
находится в файле реализации (.m) - вы можете сделать вывод о том, что это означало декларирование того, что создатель класса не хотел показывать пользователю этого класса. Обычно это означает частные и/или внутренние методы и свойства. Также обратите внимание, что есть два типа этого. Тот, который вы видите здесь, называется "расширением класса" и обозначается пустой парой круглых скобок:
@interface MyClass ()
Это особенно важно, потому что вы можете использовать это, чтобы добавить дополнительные переменные экземпляра в ваш класс.
Второй, называемый "категорией", обозначается непустой парой круглых скобок, включающей название категории, например:
@interface MyClass (CategoryName)
а также используется для расширения класса. Вы не можете добавлять переменные экземпляра в класс с помощью категорий, но у вас может быть несколько категорий для одного и того же класса, поэтому причина в основном используется для расширения классов системы/каркаса, для которых у вас нет исходного кода, поэтому категория в этом смысле является полной противоположностью расширения класса.
Ответ 2
Второй "интерфейс" определяет расширение для класса "TestTableViewController", которое не видно тому, кто только импортирует h файл. Это де-факто способ создания частных методов в объекте C.
Ответ 3
Там вы можете объявить частные методы и свойства, которые вы хотите использовать только в своем классе, но не подвергать другим классам.
Ответ 4
Интерфейс в файле TestTableViewController.h
является объявлением расширения класса. Есть два круглых скобки, которые показывают это. Синтаксис такой же, как для записи категории для класса. Но в этом случае он использовал для объявления каких-то частных методов, которые автор не хочет раскрывать в заголовочном файле
Интерфейс нормальной категории выглядит следующим образом:
@interface TestTableViewController (Your_Category_Name)
- (void)doSomething;
@end
И соответствующая реализация:
@implementation TestTableViewController (Your_Category_Name)
-(void)doSomething {
// Does something...
}
@end
В вашем примере не указано имя категории, поэтому он просто расширяет класс, и вы можете реализовать этот метод в обычной реализации.
Обычно этот метод используется для "скрытия" методов. Они не объявляются в файле заголовка и не отображаются, если вы только импортируете файл .h.