Почему не делает основного приложения для iPhone (), функционируют, когда-нибудь получают шанс закончиться?

Когда вы запустите свой контейнер, он будет работать до тех пор, пока не завершится основной процесс (определенный в поле command спецификации контейнера). Когда вы запускаете команду kill, контейнер помечается как завершенный.

Для такой отладки вы должны запустить ваше приложение без запуска основного приложения. Вы можете запустить kubectl run myappdebug -it --image=YOUR_IMAGE bash, чем сможете его отладить.

После того, как вы закончите, не забудьте удалить развертывание с вашей отладкой: kubectl del deployment/myappdebug

9
задан Clint Harris 18 February 2009 в 02:18
поделиться

6 ответов

Исходный вопрос был: "Почему не делает основного приложения для iPhone (), функционируют, когда-нибудь получают шанс закончиться?"

Короткий Ответ: Поскольку UIApplicationMain () кодируется таким образом, что он никогда не возвращается.

После выполнения нескольких тестов в Средстве моделирования и на устройстве и просьбе, чтобы другой разработчик сделал те же тесты, я подтвердил, что UIApplicationMain никогда не возвращается. Когда пользователь обычно завершает приложение путем нажатия кнопки "Домой", программа в конечном счете завершается в неопубликованном методе UIApplication, названном _terminateWithStatus. Этот выход вызовов метода (0).

Эти соответствия поведения соответствие функции NSApplicationMain (который является версией AppKit/Cocoa функции UIApplicationMain). Документация для NSApplicationMain () ясно указывает, что это никогда не будет возвращаться.

Я отправил ошибку (6600198) Apple, запрашивающей, что официальная документация (и шаблон Xcode для main.m) быть исправленным, чтобы указать, что UIApplicationMain () никогда не возвращается. В то время как это не функциональная проблема, текущий шаблон и документы вводят в заблуждение.

Благодаря всем для всего входа и мозговой атаки!

19
ответ дан 4 December 2019 в 08:35
поделиться

Попытка:

int main(int argc, char *argv[])
{
    NSLog(@"Step 0");
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSLog(@"Step 1");
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    NSLog(@"Step 2");
    [pool release];
    NSLog(@"Step 3");
    return retVal;
}

Может случиться так, что выпуск пула предотвращает дальнейший вход, в этом случае, Вы получили бы шаг 2, но не шаг 3.

Если шаг 2 не печатается, то это - почти наверняка что-то не так с UIApplicationMain - существует шанс, что это не возвращает так помещенные операторы NSLog (шаг 1.1, Шаг 1.2...) в различных точках в нем и работать для нахождения последнего сообщения зарегистрированным.

Продолжайте выполнять развертку (Шаг 1.7.1, 1.7.2.... 1.7.6.3.2...) - в конечном счете, Вы разыщете точную строку (однако глубоко в иерархии вызовов), когда сообщения журнала прекратят быть зарегистрированными, и та строка будет Вашим преступником (или "выключающий" вход или выход, не возвращаясь обычно).

Один дальнейший отрывок я нашел в сети:

=====

Когда Вы используете эту строку:

int retVal = UIApplicationMain(argc, argv, @"MyApp", @"MyApp");

Первый MyApp является Вашим делегатом главного приложения класс. Вторым является класс туда, где SpringBoard отправляет сенсорные уведомления.

Кроме того, если Вы используете SDK и определили основное перо в Info.plist, затем можно оставить вызов как:

int retVal = UIApplicationMain(argc, argv, nil, nil);

как все, что будет покрыто, когда Вы создадите свой xibs.

=====

Теперь я не знаю достаточно о разработке iPhone (конкретно xibs) для знания то, что даже означает тот последний бит (или если Вы настроили его правильно), но это походит на другую фазу компиляции.

Однако моя первая мысль от чтения, которое является тем Springboard, назовет Ваш класс делегата, когда кнопки будут нажаты, чтобы попросить, чтобы Вы сделали что-то (как закрытие корректно). Если это не может спросить Вас (т.е. никакой делегат), это, вероятно, в его правах завершить работу Вас, как это считает целесообразным, такой как с [UIApplication _terminateWithStatus:].

В мире Windows Вы, вероятно, отослали бы сообщение выхода к главному окну, но, как я говорю, разработка iPhone может отличаться.

Однако, это - авеню для исследования. Я интересовался бы наблюдением, какие вызовы были выполнены делегату при обеспечении того. Код, включенный с отрывком выше, это:

@implementation MyApp
- (void) applicationDidFinishLaunching:(id)unused {
    rect = [ UIHardware fullScreenApplicationContentRect ];
    rect.origin.x = 0.0f;
    rect.origin.y = 0.0f;
    window = [ [ UIWindow alloc ] initWithContentRect: rect ];
    [ window makeKeyAndVisible ];
    view = [ [ MyAppView alloc ] initWithFrame: rect ];
    [ window setContentView: view ];
}
- (void) dealloc {
    [ window release ];
    [ view release ];
    [ super dealloc ];
}

Таким образом, возможно, делегат с dealloc() секрет к тому, чтобы заставлять это выйти назад к main(). Почему Вы не даете этому выстрел? Это может получить Вас ближе к Вашей цели, даже если это не решает базовую проблему.

3
ответ дан 4 December 2019 в 08:35
поделиться

После [выпуск пула] нет ничего для входа к?

1
ответ дан 4 December 2019 в 08:35
поделиться

После вызова UIApplicationMain функционируйте Ваши запуски приложения (устанавливающий runloop, и т.д.) и вся работа должны затем быть сделаны вне контекста основных (при необходимости в нем, чтобы работать в основном, сделать это перед той точкой). При выходе из приложения обычно более эффективно позволить ОС делать очистку памяти.

1
ответ дан 4 December 2019 в 08:35
поделиться

попытка использующий fprintf и видит то, что происходит

int main(int argc, char *argv[])
{
    /*
       ... 
     same as above
       ... 
    */
    [pool release];
    char file_name = "/tmp/log"

    FILE *file = fopen(file_name, "w");

    fprintf(file_name, "END\n");
}

и скажите нам, что происходит

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

в gdb делают

b main.c:x 

где x является номером строки оператора возврата

1
ответ дан 4 December 2019 в 08:35
поделиться

У меня тоже есть этот непонятный опыт. И установите точки останова для проверки в точности, как сказал Клинт.

Wyquark имеет хороший аргумент.

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

0
ответ дан 4 December 2019 в 08:35
поделиться