Выполнение кода C в проекте iPhone Objective-C при запуске - PullRequest
1 голос
/ 11 декабря 2010

Я только начинаю программировать на Objective-C, у меня есть опыт работы с C. У меня есть некоторый код (около 124 строк), который я хочу перенести на iOS (из OS X). Цель кода - создать URL-адрес, а затем открыть его в Mobile Safari. Поскольку приложение не имеет пользовательского интерфейса и его единственная цель - создание и открытие URL-адреса, я хочу, чтобы этот код выполнялся при запуске приложения.

Я провел некоторое исследование и обнаружил, что если я хочу, чтобы какой-то код выполнялся при запуске, я должен поместить его в файл "App_NameDelagate.m", в

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { ...  }

сечение, между фигурными скобами. Проблема в том, что, когда я вставляю свой код и компилирую его (в XCode), я получаю около 7 ошибок и предупреждений, например, при каждом объявлении функции:

Вложенные функции отключены, используйте -fnested-functions для повторного включения

И в один прекрасный момент (когда я начинаю писать код для своих различных функций, и основная функция «если» заканчивается)

Управление достигает конца не пустой функции

Сам код состоит из 1 функции «если» и около 5 других функций, которые вызываются во время функции «если».

Я знаю, что сам код подходит, поскольку я использовал его для создания версии приложения для Mac с той же целью (для генерации и открытия URL-адреса), и он отлично работает.

Я понимаю, что некоторые вещи, связанные с Какао, меняются при переходе с OS X на iOS, например, для открытия URL-адреса в iOS используйте [UIApplication sharedApplication] вместо [NSWorkspace sharedWorkspace], как в OSX. Так что я не думаю, что это проблема. Я также удалил стандартное объявление функции "main" в начале своего вставленного кода, поскольку знаю, что оно также объявлено в файле "main.m".

В версии моего приложения для Mac я мог поместить свой код прямо в файл "main.m", и код скомпилировался бы, и приложение работало бы просто отлично. На iOS я так понял, это не тот случай.

Любая помощь с этим будет принята с благодарностью, так как она сводит меня с ума!

Спасибо.

ОБНОВЛЕНИЕ: Строки, вызывающие проблемы с «вложенными функциями»:

int generateCrosswordNumber () {

int getDayNumber () {

bool checkIfSunday () {

void handleSunday () {

void normalDay () {

Под каждой из этих строк приведен код вызываемых функций. Для каждой функции есть еще одна фигурная скобка, которая закрывает ту, которая открыта в приведенных выше строках.

return YES исправил ошибку function reaches end of non-void function, отлично работал, спасибо!

Ответы [ 2 ]

5 голосов
/ 11 декабря 2010

Итак, прежде всего, если это приложение для App Store, я думаю, что вам нужен какой-то интерфейс. Я не думаю, что вы можете загрузить, а затем сразу же внести залог в Safari. Но вам придется проверить это с Apple.

Но проблема в том, что вы обычно не можете определить функции C внутри метода Objective C. [Я думаю, вы могли бы включить вложенные функции в компиляторе, но тогда я никогда не пробовал это с вложенными функциями C внутри объективного метода C. Теоретически, должно работать, но это не так, как мы обычно делаем.]

Но вы можете вызывать функции C в вашем методе. На самом деле, мы делаем это все время. Похоже, вы делаете что-то вроде этого:

- (int)someMethod:(int)x {

    int someFunction(int x) {

        return x + 2;
    }   

    x = someFunction(x);

    return x + 3;
}

Обратите внимание, что вы определяете функцию C внутри определения метода. Но вместо этого вы можете просто сделать это:

int someFunction(int x) {

    return x + 2;
}

- (int)someMethod:(int)x {

    x = someFunction(x);

    return x + 3;
}

Теперь вы определяете функцию C, а затем также определяете целевой метод C, который использует эту функцию.

EDIT

Из любопытства я проверил несколько простых случаев вложения определений функций C в определения методов ObjC, и это, похоже, прекрасно работает в GCC с -fnested-functions. Может быть, для какого-то простого случая, который может быть более выразительным, чем определение функции на верхнем уровне, но я думаю, что если вы делаете это много или, конечно, для более чем одной функции в методе, то это, вероятно, не лучший дизайн. Кроме того, Clang не поддерживает это, поэтому, вероятно, не в ваших долгосрочных интересах писать код, подобный этому, на этой платформе, по крайней мере.

0 голосов
/ 11 декабря 2010

Ваш код Objective-C является структурно неверным. Наилучшим подходом к поиску места разрушения структуры является, вероятно, Выбрать все , а затем Правка-> Формат-> Повторный отступ .

Все определения функций должны начинаться в крайнем левом столбце, и то, что нарушает синтаксический анализ вашего файла, должно быть очевидным. Скорее всего, это будет отсутствующий] или}.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...