Есть ли лучший способ запустить одно и то же приложение из графического интерфейса или командной строки?

Я разработал способ запуска моего приложения Cocoa (GUI). Либо обычным двойным щелчком по нему, либо из интерфейса командной строки.

Я понял, что когда приложение запускается двойным щелчком (GUI), оно возвращает счетчик аргументов (argc), равный 2.

Но при запуске из CLI он будет иметь argc равное 1. Пока я сам не привожу никаких аргументов.

Это означает, что я могу использовать if .. else .., чтобы определить, как было запущено приложение.

Это отлично работает для моего приложения, поскольку мне не нужно приводить аргументы.

Но мне было интересно, есть ли лучший способ сделать это.

Вот пример кода в файле main.m

int main (int argc, const char * argv[]) {

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    //This determins if the app is launched from the command line or app itself is opened.

    if (argc == 1) {
        //app was run from CLI
        // Create a  object
        MyClass *mMyClass;
        mMyClass = [[MyClass alloc] init];
        // Read the Buffer
        [mMyClass readBuffer];

        // Write out file on disk
        [mMyClass createFile];
        [mMyClass doMoreStuff]; 

        [mMyClass release];
        mMyClass = nil;

    return 0;
    } else {

    //app was doubled click, (Opened)

   return NSApplicationMain(argc,  (const char **) argv);

   ;
   // */
   //  return NSApplicationMain(argc,  (const char **) argv);
   }
   [pool drain];
}

Огромное спасибо. M


person markhunte    schedule 03.01.2011    source источник
comment
для меня это интересный вопрос. 1 голос за.   -  person Neilvert Noval    schedule 04.01.2011
comment
Два комментария. 1 / пожалуйста, отформатируйте свой код должным образом в будущем. Форматировщик SO не любит вкладки. 2 / Технически вам нужно только выделить и осушить пул автозапуска в ветви командной строки. NSApplicationMain создает свои собственные пулы.   -  person JeremyP    schedule 04.01.2011
comment
Джереми П. 1 / Пожалуйста, не думайте, что я знаю, как это сделать или в чем проблема с форматированием. Я не. Спасибо за внимание. 2 / Спасибо, что указали на пул автозапуска, который имеет смысл.   -  person markhunte    schedule 04.01.2011


Ответы (1)


Помимо проверки argc, вы можете рассмотреть возможность проверки самого значения argv.

для приложений, запускаемых двойным щелчком:

1/4/11 9:43:30 AM   Untitled[605]   argc: 2
1/4/11 9:43:30 AM   Untitled[605]   argv0: /tmp/Untitled/build/Debug/Untitled.app/Contents/MacOS/Untitled
1/4/11 9:43:30 AM   Untitled[605]   argv1: -psn_0_131104

для приложений, работающих в командной строке:

1/4/11 9:43:44 AM   Untitled[608]   argc: 1
1/4/11 9:43:44 AM   Untitled[608]   argv0: ./Untitled
1/4/11 9:43:44 AM   Untitled[608]   argv1: (null)
person Neilvert Noval    schedule 04.01.2011
comment
Спасибо, Нилверт. Когда я смотрю на argv0, я получаю тот же полный путь к двоичному файлу. Я должен указать, что я запускаю приложение из интерфейса командной строки, используя полный путь. - person markhunte; 04.01.2011
comment
argv[0] по соглашению будет именем команды, введенным вами в оболочке. - person JeremyP; 04.01.2011
comment
Интересно, достаточно ли проверки -psn в argv[1]. Кто-нибудь это знает? - person ; 04.01.2011
comment
Спасибо, Bavarious. Думаю, если я использую argv [1]. Тогда я мог бы также использовать свой собственный аргумент в CLI. и ищите это. Что, я думаю, может быть лучше. Любые другие идеи приветствуются. Спасибо - person markhunte; 04.01.2011
comment
Обновление: я использовал комбинацию проверки argv1 для -psn и моих собственных аргументов для запуска CLI. Итак, я принял ответ Нилверта Новаля. Но спасибо также Bavarious. - person markhunte; 26.03.2011