.h
или «файл заголовка» содержит интерфейс. .m
или «файл реализации» содержит реализацию.
Каждый файл реализациитакже называется «модулем компиляции», потому что компилятор компилирует каждый из них отдельно.В каждом модуле компиляции компилятор должен знать о типах и методах.Все, что нужно знать о классе для создания правильного кода, - это информация о методах, которые он реализует.
Итак, давайте представим, что у вас есть эти файлы:
Car.h
#import <Foundation/Foundation.h>
@interface Car : NSObject
- (void)drive;
@end
Car.m
#import "Car.h"
@implementation Car
- (void)drive {
NSLog(@"I'm driving!");
}
@end
Person.h
#import <Foundation/Foundation.h>
@class Car;
@interface Person : NSObject
@property (nonatomic, strong) Car *car;
- (void)start;
@end
Person.m
#import "Person.h"
#import "Car.h"
@implementation Person
@synthesize car;
- (void)start {
[car drive];
}
@end
Теперь, когда компилятор работает, он компилирует обаCar.m
и Person.m
в Car.o
и Person.o
соответственно.[Затем они попадают в окончательный двоичный файл, но это пока выходит за рамки этого вопроса].
Когда он компилирует Person.m
, компилятору не нужно знать, как - (void)drive
из Car
реализован, но ему нужно знать, что он существует, что это метод, который не принимает аргументов и ничего не возвращает.Он не заботится о реализации, просто он существует .Так что вам просто нужно #import
файл заголовка Car
, чтобы сообщить компилятору о методах, существующих в Car
.Компилятор знает, что реализация существует, потому что вы сказали об этом, а затем компоновщик сделает свое дело, чтобы правильно подключить вызов метода к правильной реализации.Как линкер на самом деле это делает, это огромная тема, и я призываю вас пойти и прочитать об этом отдельно, если вы этого еще не поняли.
Обратите внимание, что это одинаково для всех стандартных NS
классов.которые вы используете, такие как NSObject
, NSString
и т. д. Вам просто нужно #import
Foundation.h
из Foundation
фреймворка, который сообщает компилятору о том, что это за классы и какие методы для них определены.