Подтвердить что ты не робот

Почему существует @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. Почему он там? Мне это нужно?

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

4b9b3361

Ответ 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.