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

Краткое описание того, как файлы .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. Я предполагаю, что я пытаюсь сказать, что это похоже на довольно легкую программу, чтобы узнать, как разные порции работают друг с другом - может ли кто-нибудь объяснить на нетехническом жаргоне?

4b9b3361

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