2011-01-18 35 views
14

Tôi vừa mới bắt đầu học phát triển iOS và bây giờ tôi có sigabrt về chức năng chính của mình. Lỗi này được kích hoạt bằng cách gọi:Sigabrt trên chức năng chính

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

Vì tôi rất mới với lập trình iOS, tôi không biết gì về nguyên nhân gây ra lỗi này. Một điều mà tôi đã tìm thấy trên callstack của tôi là ngoại lệ sau đây được nâng lên: dyld_stub_objc_exception_throw Điều gì có thể gây ra lỗi này?

Trả lời

2

Đó chỉ là lỗi điển hình của người nào đó đang học ngôn ngữ/API mới. Tôi quên thiết lập đúng chế độ xem.

UIView *controllersView = [myViewController view]; 
[window addSubview:controllersView]; 
2

UIApplicationMain về cơ bản sẽ loại bỏ phần còn lại của ứng dụng của bạn, vì vậy nguyên nhân thực sự của sự cố có thể ở bất kỳ đâu trong ứng dụng của bạn. Bạn có thể cần xem xét kỹ hơn ngăn xếp cuộc gọi.

Tuy nhiên, tôi lưu ý rằng bạn đang vượt qua nil làm hai tham số cuối cùng. Số nil đầu tiên là đối số principalClassName, có thể hợp pháp là không nếu bạn muốn UIApplication làm lớp chính. Số thứ hai nil là tên ứng cử viên; bạn nên vượt qua nil nếu bạn tải đại biểu từ ngòi chính. Bạn có? Nếu bạn không, đó có thể là vấn đề (Tôi không thể nói rằng tôi đã từng gọi chức năng này với cả hai đối số nil).

+0

Tôi đã thử chuyển tên đại biểu nhưng không thành công ở đó. Tôi tìm thấy nó lỗi xảy ra trước khi mã của tôi có thể chạy didFinishLaunchingWithOptions không bao giờ chạy – Raphael

33

Tôi gặp sự cố này trong X-Code 4.2 và vấn đề là không thể tìm thấy Bảng phân cảnh của tôi. Phần bực bội là không có dấu hiệu cho thấy ngoại lệ thực sự là gì. Tôi đã có thể nhận được ngoại lệ trong nhật ký bằng cách thêm một try/catch vào chức năng chính của tôi. (Lưu ý tôi đang sử dụng ARC, vì vậy nếu bạn không sử dụng ARC, chính bạn sẽ có một chút khác biệt khi thử bắt)

int main(int argc, char *argv[]) 
{ 
    int retVal = 0; 
    @autoreleasepool { 
     NSString *classString = NSStringFromClass([sortaAppDelegate class]); 
     @try { 
      retVal = UIApplicationMain(argc, argv, nil, classString); 
     } 
     @catch (NSException *exception) { 
      NSLog(@"Exception - %@",[exception description]); 
      exit(EXIT_FAILURE); 
     } 
    } 
    return retVal; 
} 
+0

Đó là một phao cứu sinh, ứng dụng của tôi mong đợi một UITableViewController nơi tôi đã đi qua một UIViewController. – Echilon

+1

Tôi cũng khuyên bạn nên NSLogging '[exception callStackSymbols];' để có được dấu vết ngăn xếp. Bạn cũng không có gọi 'mô tả' cho mô tả, bạn chỉ có thể đi 'NSLog (@" Ngoại lệ -% @ ", ngoại lệ);' (Khi bạn gửi nó vào một chuỗi định dạng như nslog đó là). – apple16

+1

Kỹ thuật này thật tuyệt vời! Tất cả mọi người nên đề nghị giúp bẫy các ngoại lệ khó tìm thấy tương tự. Tôi hiện đang thêm macro DEBUG đặc biệt vào tất cả các dự án của tôi để thiết lập loại báo cáo ngoại lệ này. – jpap

Các vấn đề liên quan