2013-06-02 2 views
0

Здравствуйте, я довольно новичок в программировании, но я слежу за несколькими учебниками в Objective C. Я просто столкнулся с проблемой в учебнике по обработке исключений, и мой код не работал одинаково ,Справка по обработке исключений Xcode 4.6

Прежде всего это мой код в основной:

#import < Foundation/Foundation.h> 
#import "Numz.h" 

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

@autoreleasepool { 

    Numz *n = [[Numz alloc]init]; 
    @try { 
     [n thisisgoingtogetanerror] <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< error on this line  
     } 

    @catch (NSException *e) { 
      NSLog(@"you got an error in your program"); 
     } 
     NSLog(@"this is code aftr the error"); 
    } 

    return 0; 
} 

Ошибка выше говорит

не видно @interface для 'Numz' заявляет селектор 'thisisgoingtogetanerror'

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

Это может быть некоторые настройки в xcode 4.6, которые мне нужно изменить, но я не могу заставить код запускать и обрабатывать ошибку. Я смотрю онлайн и не могу найти ответы.

Любая помощь будет отличной.

+0

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

+0

Это не связано с xcode. Компилятор Objective-C никогда не будет компилировать это (по крайней мере, вызывать предупреждение в проектах, отличных от ARC), независимо от среды, которую вы можете использовать. –

ответ

2

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

Изменение его (при условии Numz не подкласс NSArray ни реализует метод count): [n count];.

Обратите внимание, что вы должны никогда не использовать исключения для управления потоком. То есть вы не должны делать исключение, а затем использовать @catch для обработки исключения и продолжения выполнения. Исключения в iOS/Cocoa используются только для обозначения неустранимых ошибок.

Попробуйте это:

@interface NSObject(Badness) 
- (void)methodBadness; 
@end 

Затем вызовите этот метод в вашем коде. Компилятор не должен предупреждать, runtime должен @throw.

+0

Я все еще смущен, потому что это не ошибка обработки ошибок? Он видит ошибку, но он не справляется с этим, как будто я тоже хочу. Опять я ноб, и я не понимаю, что вы подразумеваете под контролем потока. Я также попытался «подсчитать» и получил ту же ошибку ... – ctapp1

+0

В Cocoa/iOS бросание исключений, а затем перехват и восстановление - это * не * как вы справляетесь с обработкой ошибок. Это совершенно не похоже на Java. – bbum

+0

Я понял, если отключу Автоматический подсчет ссылок, он будет запускать код, как я тоже хочу ..... не знаю, почему, хотя бы какие-то мысли? – ctapp1

0

Обработка исключений используется для ошибок/исключений при времени выполнения. Но ошибка вы получаете происходит во время компиляции

Вы можете вызвать ошибку во время выполнения через что-то вроде этого:

@interface RuntimeError : NSObject 
+ (void)cause; 
@end 

@implementation RuntimeError 
+ (void)cause { 
    NSAssert(NO, @"This is a runtime error caused through a assertion failure") 
} 
@end 

// Call it with 
//  [RuntimeError cause] 
// inside the @try-Block 
+0

Спасибо, что помогли – ctapp1

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