Xcode错误 - 线程1:信号SIGABRT

17

我正在创建一个简单的RSS应用程序,但我不太擅长Objective-C。该应用程序总是成功构建,没有错误或警告,在UITableView中读取RSS时,每当我按下单元格时,它都会终止,并且在main.m中,该线程将出现“Thread 1:signal SIGABRT”在此行:

return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

我的应用信息:

该应用是使用 Xcode 版本 4.3.1 创建的,使用 MacBook 上的“主细节应用程序”模板创建的 iPhone 应用。我正在使用 LLDB 调试器和 iPhone 模拟器 5.1。我使用了 Storyboard。

这是 Main.m:

#import <UIKit/UIKit.h>

#import "AppDelegate.h"

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

    @autoreleasepool {
       return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

AppDelegate.h 是:

#import <UIKit/UIKit.h>

@interface AppDelegate : NSObject <UIApplicationDelegate> {

    UIWindow *window;
    UINavigationController *navigationController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;

@end

我的AppDelegate.m文件如下:

#import "AppDelegate.h"




#import "AppDelegate.h"
#import "MasterViewController.h"


@implementation AppDelegate

@synthesize window;
@synthesize navigationController;


#pragma mark -
#pragma mark Application lifecycle

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    // Override point for customization after app launch    

    [window addSubview:[navigationController view]];
    [window makeKeyAndVisible];
    return YES;
}


- (void)applicationWillTerminate:(UIApplication *)application {
    // Save data if appropriate
}


#pragma mark -
#pragma mark Memory management

- (void)dealloc {
    [navigationController release];
    [window release];
    [super dealloc];
}


@end

这是控制台消息:

2012-03-17 17:32:29.498 Rahnavard[1862:12e03] fetch rss
2012-03-17 17:33:01.212 Rahnavard[1862:f803] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </Users/hassantavari/Library/Application Support/iPhone Simulator/5.1/Applications/48090189-E17C-40CF-9BF1-ACA18FC0B02B/Rahnavard.app> (loaded)' with name 'DetailViewController''
*** First throw call stack:
(0x16e4022 0x1875cd6 0x168ca48 0x168c9b9 0x366638 0x20c1fc 0x20c779 0x20c99b 0x20cd11 0x21e8fd 0x21eaef 0x21edbb 0x21f85f 0x21fe06 0x21fa24 0x393c 0x1d65c5 0x1d67fa 0xa6b85d 0x16b8936 0x16b83d7 0x161b790 0x161ad84 0x161ac9b 0x15cd7d8 0x15cd88a 0x145626 0x26a2 0x2615)
terminate called throwing an exception(lldb)

这里是获取 RSS 订阅的地方:

-(void)fetchRss
{   
    NSLog(@"fetch rss");
    NSData* xmlData = [[NSMutableData alloc] initWithContentsOfURL:[NSURL URLWithString: kRSSUrl] ];
    NSError *error;

    GDataXMLDocument* doc = [[GDataXMLDocument alloc] initWithData:xmlData options:0 error:&error];

    if (doc != nil) {
        self.loaded = YES;

        GDataXMLNode* title = [[[doc rootElement] nodesForXPath:@"channel/title" error:&error] objectAtIndex:0];
        [self.delegate updatedFeedTitle: [title stringValue] ];

        NSArray* items = [[doc rootElement] nodesForXPath:@"channel/item" error:&error];
        NSMutableArray* rssItems = [NSMutableArray arrayWithCapacity:[items count] ];

        for (GDataXMLElement* xmlItem in items) {
            [rssItems addObject: [self getItemFromXmlElement:xmlItem] ];
        }

        [self.delegate performSelectorOnMainThread:@selector(updatedFeedWithRSS:) withObject:rssItems waitUntilDone:YES];
    } else {
        [self.delegate performSelectorOnMainThread:@selector(failedFeedUpdateWithError:) withObject:error waitUntilDone:YES];
    }

    [doc autorelease];
    [xmlData release];
}

MasterViewController.h:

#import <UIKit/UIKit.h>
#import "RSSLoader.h"
#import "DetailViewController.h"


@interface MasterViewController : UITableViewController<RSSLoaderDelegate> {

    RSSLoader* rss;
    NSMutableArray* rssItems;

}



@end

MasterViewController.m:

#import "MasterViewController.h"

#import "DetailViewController.h"




@implementation MasterViewController

#pragma mark -
#pragma mark View lifecycle

- (void)viewDidLoad {
    [super viewDidLoad];

    self.navigationItem.title = @"RAHNAVARD";
    self.navigationItem.prompt = @"LATEST NEWS";
    rssItems = nil;
    rss = nil;

    self.tableView.backgroundColor = [UIColor whiteColor];
    [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
    [self.tableView setIndicatorStyle:UIScrollViewIndicatorStyleWhite];

    //self.tableView.tableHeaderView = [[TableHeaderView alloc] initWithText:@"fetching rss feed"];

}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    if (rss==nil) {
        rss = [[RSSLoader alloc] init];
        rss.delegate = self;
        [rss load];
    }
}

/*
 - (void)viewWillDisappear:(BOOL)animated {
 [super viewWillDisappear:animated];
 }
 */
/*
 - (void)viewDidDisappear:(BOOL)animated {
 [super viewDidDisappear:animated];
 }
 */

/*
 // Override to allow orientations other than the default portrait orientation.
 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
 // Return YES for supported orientations.
 return (interfaceOrientation == UIInterfaceOrientationPortrait);
 }
 */


#pragma mark -
#pragma mark Table view data source

// Customize the number of sections in the table view.
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}


// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (rss.loaded == YES) {
        return [rssItems count]*2;
    } else {
        return 1;
    }
}

- (UITableViewCell *)getLoadingTableCellWithTableView:(UITableView *)tableView 
{
    static NSString *LoadingCellIdentifier = @"LoadingCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:LoadingCellIdentifier];

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:LoadingCellIdentifier] autorelease];
    }

    cell.textLabel.text = @"Loading...";

    UIActivityIndicatorView* activity = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    [activity startAnimating];
    [cell setAccessoryView: activity];
    [activity release];

    return cell;
}

- (UITableViewCell *)getTextCellWithTableView:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath {
    static NSString *TextCellIdentifier = @"TextCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:TextCellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:TextCellIdentifier] autorelease];
    }

    NSDictionary* item = [rssItems objectAtIndex: (indexPath.row-1)/2];

    //article preview
    cell.textLabel.font = [UIFont systemFontOfSize:11];
    cell.textLabel.numberOfLines = 3;
    cell.textLabel.textColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.7];
    cell.backgroundColor = [UIColor clearColor];
    cell.textLabel.backgroundColor = [UIColor clearColor];

    UIView *backView = [[[UIView alloc] initWithFrame:CGRectZero] autorelease];
    backView.backgroundColor = [UIColor clearColor];
    cell.backgroundView = backView;

    CGRect f = cell.textLabel.frame;
    [cell.textLabel setFrame: CGRectMake(f.origin.x+15, f.origin.y, f.size.width-15, f.size.height)];
    cell.textLabel.text = [item objectForKey:@"description"];

    return cell;
}

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    if (rss.loaded == NO) {
        return [self getLoadingTableCellWithTableView:tableView];
    }

    if (indexPath.row % 2 == 1) {
        return [self getTextCellWithTableView:tableView atIndexPath:indexPath];
    }

    static NSString *CellIdentifier = @"TitleCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    UIView *backView = [[[UIView alloc] initWithFrame:CGRectZero] autorelease];
    backView.backgroundColor = [UIColor clearColor];
    cell.backgroundView = backView;

    NSDictionary* item = [rssItems objectAtIndex: indexPath.row/2];

    cell.textLabel.text = [item objectForKey:@"title"];

    return cell;
}



/*
 // Override to support conditional editing of the table view.
 - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
 // Return NO if you do not want the specified item to be editable.
 return YES;
 }
 */


/*
 // Override to support editing the table view.
 - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

 if (editingStyle == UITableViewCellEditingStyleDelete) {
 // Delete the row from the data source.
 [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
 }   
 else if (editingStyle == UITableViewCellEditingStyleInsert) {
 // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.
 }   
 }
 */


/*
 // Override to support rearranging the table view.
 - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
 }
 */


/*
 // Override to support conditional rearranging of the table view.
 - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
 // Return NO if you do not want the item to be re-orderable.
 return YES;
 }
 */


#pragma mark -
#pragma mark Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView deselectRowAtIndexPath:indexPath animated:NO];

    //DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
    DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
    detailViewController.item = [rssItems objectAtIndex:floor(indexPath.row/2)];
    [self.navigationController pushViewController:detailViewController animated:YES];
    [detailViewController release];
}


#pragma mark -
#pragma mark Memory management

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Relinquish ownership any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand.
    // For example: self.myOutlet = nil;
}


- (void)dealloc {
    [rssItems release];
    rssItems = nil;

    [rss release];
    rss = nil;

    [super dealloc];
}

#pragma mark -
#pragma mark RSSLoaderDelegate
-(void)updatedFeedWithRSS:(NSMutableArray*)items
{
    rssItems = [items retain];
    [self.tableView reloadData];
}

-(void)failedFeedUpdateWithError:(NSError *)error
{
    //
}

@end

如果您需要更多信息,请通过回答告诉我,我将编辑我的问题,然后您将编辑您的答案。
我非常感谢您的帮助。

6
SIGABRT表示触发了异常。控制台日志将打印出确切的异常消息,您需要查看并将其贴在这里。 - DarkDust
1
嘿,你忘记添加你的Xcode项目文件和xib XML文件了。 - Abizern
3个回答

11

SIGABRT通常意味着存在未捕获的异常。控制台上应该会有更多信息。


9

您正在尝试加载名为DetailViewController的XIB文件,但是没有此类XIB文件存在或者它不是您当前目标的成员。


1
补充一下这个答案 - 你可以使用Ctrl-Click然后删除插座。它在我的代码中根本不存在,这是我唯一能够删除它的方法。甚至产品>清理也不起作用。 - William

0

SIGABRT是一个常见的未捕获异常,正如其他答案所述。你应该学习更多关于Objective-C的知识。问题可能出现在你的UITableViewDelegate方法didSelectRowAtIndexPath中。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

在你展示处理表数据源和委托方法的代码之前,我无法告诉你更多信息。


你为什么认为是表视图引起了问题,当异常谈论无法加载 NIB 时? - DarkDust
1
因为,这是在您点击表视图单元格时发生的。但我注意到了另一件事 - 您如何准确地呈现新的视图控制器?如果需要指定 bundle,请确保有 [NSBundle mainBundle]。还可能是编译和构建中的错误。检查您的 XIB 是否具有正确的目标,并尝试清理(Command+Shift+K)和构建清理(Command+Shift+Alt+K)。如果我们能看到您获取 rss 并处理触摸的代码部分(至少部分),那就太好了。 - Dominik Hadl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接