【问题标题】:Xcode error - Thread 1: signal SIGABRT [closed]Xcode 错误 - 线程 1:信号 SIGABRT [关闭]
【发布时间】:2012-04-02 18:15:50
【问题描述】:

我正在创建一个简单的 RSS 应用程序,但我在 Objective-c 方面做得不是很好。应用程序将始终成功构建并且没有错误或警告,在读取 RSS 的 UITableView 中,每当我按下单元格时,它将终止,并且在 main.m 中,该线程将在这一行出现“线程 1:信号 SIGABRT” :

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

我的应用信息:

该应用由 Xcode 版本创建:4.3.1 该应用程序是从 iPhone 和 MacBook 的“主从应用程序”模板创建的。 我使用的调试器是 LLDB,我的 iPhone 模拟器是 5.1 我正在使用故事板

这是 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

如果您想了解更多信息,只需通过答案告诉我,我将编辑我的问题,然后您将编辑您的答案。

非常感谢您的帮助。

【问题讨论】:

  • SIGABRT 表示触发了异常。控制台日志将打印确切的异常消息,您需要查看(在此处发布)。
  • 嘿,你忘了添加你的 Xcode 项目文件和 xib XML 文件。

标签: iphone objective-c xcode sigabrt


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 当异常谈到无法加载 NIB 时,您怎么会认为是表格视图导致了问题?
    • 因为,当您点击表格视图单元格时会发生这种情况。但我注意到另外一件事——你究竟是如何展示新的视图控制器的?如果需要指定捆绑包,请确保您有 [NSBundle mainBundle]。而且它也可能是编译和构建的错误。检查您的 XIB 是否有正确的目标并尝试清理 (Command+Shift+K) 和构建清理 (Command+Shift+Alt+K)。如果我们能看到您获取 RSS 并处理触摸的代码部分,那就太好了。 (至少是其中的一部分)
    【解决方案3】:

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

    【讨论】:

    • 要添加到这个答案 - 您可以按住 Ctrl 键单击然后删除插座。它不在我的代码中,这是我可以删除它的唯一方法。甚至 Product > Clean 都没有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    相关资源
    最近更新 更多