Краткое описание того, как файлы .h и .m взаимодействуют в объекте c?
Я только начал изучать цель C и действительно запутался, как файлы .h и .m взаимодействуют друг с другом. Эта простая программа имеет 3 файла:
Fraction.h
#import <Foundation/NSObject.h>
@interface Fraction : NSObject {
int numerator;
int denominator;
}
- (void) print;
- (void) setNumerator: (int) n;
- (void) setDenominator: (int) d;
- (int) numerator;
- (int) denominator;
@end
Fraction.m
#import "Fraction.h"
#import <stdio.h>
@implementation Fraction
-(void) print { printf( "%i/%i", numerator, denominator ); }
-(void) setNumerator: (int) n { numerator = n; }
-(void) setDenominator: (int) d { denominator = d; }
-(int) denominator { return denominator; }
-(int) numerator { return numerator; }
@end
main.m
#import <stdio.h>
#import "Fraction.h"
int main(int argc, char *argv[]) {
Fraction *frac = [[Fraction alloc] init];
[frac setNumerator: 1];
[frac setDenominator: 3];
printf( "The fraction is: " );
[frac print];
printf( "\n" );
[frac release];
return 0;
}
Из того, что я понимаю, программа изначально запускает файл main.m. Я понимаю основные понятия C, но весь этот "класс" и "экземпляр" действительно путают. В файле Fraction.h @interface определяет числитель и знаменатель как целое число, но что еще он делает с помощью (void)? и какова цель переопределения ниже? Я также довольно смущен относительно того, что происходит с (void) и (int) частями Fraction.m и как все это объединяется в файл main.m. Я предполагаю, что я пытаюсь сказать, что это похоже на довольно легкую программу, чтобы узнать, как разные порции работают друг с другом - может ли кто-нибудь объяснить на нетехническом жаргоне?
Ответы
Ответ 1
Люди, которые приходят из других окружений, всегда, похоже, считают, что с файлами .c,.m и .h, используемыми в программах C и Objective-C, происходит что-то сложное.
Собственно, его очень, ОЧЕНЬ просто.
С целью создания проекта Интегрированные среды разработки - например, XCode - игнорируют все .h файлы. То, что они делают, это взять каждый файл .c и .m и скомпилировать его. Если программист (то есть вы) использовал какие-либо директивы #include или #import, компилятор вставляет весь текст включенного/импортированного файла .h, где была указана.
Итак, если у вас есть файл .h - insert.h - сказано следующее:
in
И файл .c, который сказал:
Alice
#include "insert.h"
Wonderland
После обработки директив #include и #import компилятор может увидеть это:
Alice
in
Wonderland
Это очень ОЧЕНЬ простое слияние файлов, которое мы используем для создания сложных программ:)
.h - это просто соглашение, посредством которого программисты могут сообщать друг другу, что файл подходит для объединения - потенциально многократно - с помощью #include или #import.
Файлы .c и .m не объединены. Каждый файл .c и .m компилируется отдельно - для создания файлов .o. Каждый .o файл представляет собой набор скомпилированных функций. Затем файлы .o затем объединяются - или "связаны" - для создания окончательной программы.
Шаг привязки гарантирует, что каждая функция существует только один раз и что все функции, которые вызывают, действительно существуют где-то.
C и Objctive-C определяют одну специальную функцию, которая должна существовать где-то - main()
. Опять же, язык очень расслаблен - ему все равно, какой файл .c или .m находится в функции main()
. Просто, что он где-то существует в каком-то файле.
Ответ 2
Вам нужно взглянуть на Object Oriented Programming и, возможно, немного почитать в разработке Objective-C, чтобы получить хорошее представление о концепции ООП и т.д.
Чтобы ответить на ваш вопрос "в чем разница между файлами .h и .m", файлы .h содержат объявление для вашего класса, поэтому в основном все атрибуты и методы, которые он может использовать. Файл .m - это реализация этих методов.
В условиях laymans заголовочный файл (.h) - это способ сказать: "Это то, что я могу сделать", а .m - "Вот как я это делаю". Это немного сложнее, чем это.
Ответ 3
Файлы не взаимодействуют вообще, использование их - просто соглашение, вы также можете поместить все в файл main.m
.
Хорошей отправной точкой для обучения Objective-C является введение в язык Objective-C.
Ответ 4
В двух словах класс Objective-C представляет собой структуру C. Экземпляр - это ссылка на такую структуру, которая была выделена в памяти. Класс имеет имя и экземпляр имеет состояние или значение.
Вещь, которая устанавливает класс Objective-C, помимо структуры C, - это возможность поиска адресов методов по имени. В упрощенных выражениях структура имеет хеш-таблицу указателей функций с ключом по имени.
В объектах Objective-C есть много других тонкостей, таких как подсчет ссылок, но вызов методов по имени - это его суть. SEL является строкой C, но строка C не является SEL.
Что касается заголовков и исходных файлов, по соглашению вы объявляете интерфейс для класса в файлах заголовков и определяете методы в исходном файле. Определение вещей, отличных от типов и констант, в файле заголовка является плохой практикой, так как включает исходные файлы. Вы можете объявлять все, что захотите, в исходном файле, но по сути конфиденциально исходному файлу.
A C исполняемый файл и, следовательно, исполняемый файл Objective-C имеет точку входа в основной функции. По соглашению main определяется в файле с тем же именем в проектах Objective-C.
Ответ 5
Ниже строки кода в Fraction.h - не что иное, как методы getter. Они не переопределяют две переменные int, объявленные выше.
- (int) numerator;
- (int) denominator;