2013-06-02 80 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; 
} 

錯誤上面說

爲 'Numz' 不可見的@interface聲明選擇 'thisisgoingtogetanerror'

我的接口和實現已創建,但沒有創建內部變量或方法,但這不是我爲什麼需要處理錯誤在第一位?
此外,我無法獲得任何形式的控制檯視圖,構建失敗並指出我出現該錯誤。

可能是 xcode 4.6中的一些設置,我需要更改但我無法獲取運行和處理錯誤的代碼。我在網上查找並找不到任何答案。

任何幫助將是偉大的。

+0

良好,沒有分號,我不認爲這會以任意組合方式來編譯的編譯器標誌.. –

+0

這不是真的與xcode相關。 Objective-C編譯器永遠不會編譯這個(至少會在非ARC項目中提出警告),使您可以使用IDE。 –

回答

2

編譯器抱怨,因爲你正在調用一個方法,它沒有看到過任何聲明。

將其更改爲(假設Numz不是NSArray的子類,也不實施count方法):[n count];

請注意,您應該從不使用流量控制例外。也就是說,您應該不會@throw出現異常,然後使用@catch來處理異常並繼續執行。 iOS/Cocoa中的例外僅用於指示不可恢復的錯誤。

試試這個:

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

然後調用該方法在你的代碼。編譯器不應該警告,運行時應該@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