2015-07-09 2 views
0

Я новичок в Swift.Сбрасывание стека и исключений в случае сбоя в Swift

Когда у меня действительно трудно ошибка взломать на Objective-C я вообще заменить мой main.m файл с чем-то вроде этого:

int main(int argc, char *argv[]) { 
    int retVal; 
    @autoreleasepool { 
    @try { 
     retVal = UIApplicationMain(argc, argv, nil, nil); //*** 
    } 
    @catch (NSException *exception) { 
     NSLog(@"\n\nSTACK SYMBOLS\n%@",[exception callStackSymbols]); 
     NSLog(@"\n\nSTACK RETURN ADDRESSES\n%@", 
        [exception callStackReturnAddresses]); 
     NSLog(@"\n\nOBJECT: %@",[exception name]); 
     NSLog(@"\n\nUSER INFO DICT: %@",[exception userInfo]); 
     NSLog(@"\n\nREASON: %@",[exception reason]); 
     retVal = 1; 
    } 
    } 
    return retVal; 
} 

Это поможет собрать информацию о катастрофе.

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

Есть ли что-то подобное для Swift?

+0

Обновить свой вопрос с попыткой преобразования до Свифта. – rmaddy

ответ

1

Нет реального эквивалента этому рисунку в чистом Swift, потому что нет никакого эквивалента @try в Swift. (Swift2's try не имеет отношения к делу и радикально отличается в использовании и реализации.)

Это говорит о том, что есть способ переопределить запуск программы. Из Programming Guide:

UIApplicationMain

Примените этот атрибут к классу, чтобы указать, что делегат приложения. Использование этого атрибута эквивалентно вызову функции UIApplicationMain и передаче имени этого класса в качестве имени класса делегата.

Если вы не используете этот атрибут, поставьте файл main.swift с основной функцией, которая вызывает функцию UIApplicationMain(_:_:_:). Например, если ваше приложение использует собственный подкласс UIApplication в качестве его основного класса, вызовите функцию UIApplicationMain(_:_:_:) вместо использования этого атрибута.

Таким образом, вы можете удалить UIApplicationMain от делегата приложения, и создать swift.main файл, как описано. Но вы не можете перехватывать исключения.

Но вы, конечно, могли бы использовать свои выше main.m в ObjC, и он будет работать одинаково. Просто удалите атрибут UIApplicationMain.

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

+1

иногда бывает. Я использую это, когда Xcode не дает никакого представления об этой проблеме, и иногда это работает, давая мне то, что помогает идентифицировать проблему. Благодарю. – SpaceDog

Смежные вопросы