由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'-[__NSArrayM itemName]:无法识别的选择器发送到实例

Posted

技术标签:

【中文标题】由于未捕获的异常\'NSInvalidArgumentException\'而终止应用程序,原因:\'-[__NSArrayM itemName]:无法识别的选择器发送到实例【英文标题】:Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM itemName]: unrecognized selector sent to instance由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'-[__NSArrayM itemName]:无法识别的选择器发送到实例 【发布时间】:2014-11-25 13:23:52 【问题描述】:

这是我从 sqlite 文件加载数据的代码

- (void) loadInitialData

    // Form the query.
    NSString *query = @"select * from tasklist";

    // Get the results.
    if (self.toDoItems != nil) 
        self.toDoItems = nil;
    


    NSArray *dbResultArray = [[NSArray alloc] initWithArray:[self.dbManager loadDataFromDB:query]];

    //Logging for debug purpose
    NSLog(@"Result set starts");

    for(NSArray *subArray in dbResultArray) 
        NSLog(@"Data in array: %@",subArray);
    

    NSLog(@"Result set ends");

    self.toDoItems = [[NSMutableArray alloc]initWithArray:dbResultArray];

    // Reload the table view.
    //[self.tblPeople reloadData];
    [self.tableView reloadData];


- (void)viewDidLoad

    [super viewDidLoad];

    self.dbManager = [[DBManager alloc] initWithDatabaseFilename:@"todotaskdb.sql"];

    self.toDoItems = [[NSMutableArray alloc] init];
    [self loadInitialData];

我在使用 NSLog 时遇到了这个错误

2014-11-25 18:24:13.862 ToDoList[3213:60b] Result set ends
2014-11-25 18:24:13.865 ToDoList[3213:60b] -[__NSArrayM itemName]: unrecognized selector sent to instance 0x8c996f0
2014-11-25 18:24:13.900 ToDoList[3213:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM itemName]: unrecognized selector sent to instance 0x8c996f0'
*** First throw call stack:
(
    0   CoreFoundation                      0x018dc1e4 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x0165b8e5 objc_exception_throw + 44
    2   CoreFoundation                      0x01979243 -[NSObject(NSObject) doesNotRecognizeSelector:] + 275
    3   CoreFoundation                      0x018cc50b ___forwarding___ + 1019
    4   CoreFoundation                      0x018cc0ee _CF_forwarding_prep_0 + 14
    5   ToDoList                            0x00004882 -[XYZToDoListTableViewController tableView:cellForRowAtIndexPath:] + 306
    6   UIKit                               0x0041411f -[UITableView _createPreparedCellForGlobalRow:withIndexPath:] + 412
    7   UIKit                               0x004141f3 -[UITableView _createPreparedCellForGlobalRow:] + 69
    8   UIKit                               0x003f5ece -[UITableView _updateVisibleCellsNow:] + 2428
    9   UIKit                               0x0040a6a5 -[UITableView layoutSubviews] + 213
    10  UIKit                               0x0038a964 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 355
    11  libobjc.A.dylib                     0x0166d82b -[NSObject performSelector:withObject:] + 70
    12  QuartzCore                          0x03d4745a -[CALayer layoutSublayers] + 148
    13  QuartzCore                          0x03d3b244 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 380
    14  QuartzCore                          0x03d473a5 -[CALayer layoutIfNeeded] + 160
    15  UIKit                               0x0044cae3 -[UIViewController window:setupWithInterfaceOrientation:] + 304
    16  UIKit                               0x00362aa7 -[UIWindow _setRotatableClient:toOrientation:updateStatusBar:duration:force:isRotating:] + 5212
    17  UIKit                               0x00361646 -[UIWindow _setRotatableClient:toOrientation:updateStatusBar:duration:force:] + 82
    18  UIKit                               0x00361518 -[UIWindow _setRotatableViewOrientation:updateStatusBar:duration:force:] + 117
    19  UIKit                               0x003615a0 -[UIWindow _setRotatableViewOrientation:duration:force:] + 67
    20  UIKit                               0x0036063a __57-[UIWindow _updateToInterfaceOrientation:duration:force:]_block_invoke + 120
    21  UIKit                               0x0036059c -[UIWindow _updateToInterfaceOrientation:duration:force:] + 400
    22  UIKit                               0x003612f3 -[UIWindow setAutorotates:forceUpdateInterfaceOrientation:] + 870
    23  UIKit                               0x003648e6 -[UIWindow setDelegate:] + 449
    24  UIKit                               0x0043eb77 -[UIViewController _tryBecomeRootViewControllerInWindow:] + 180
    25  UIKit                               0x0035a474 -[UIWindow addRootViewControllerViewIfPossible] + 591
    26  UIKit                               0x0035a5ef -[UIWindow _setHidden:forced:] + 312
    27  UIKit                               0x0035a86b -[UIWindow _orderFrontWithoutMakingKey] + 49
    28  UIKit                               0x003653c8 -[UIWindow makeKeyAndVisible] + 65
    29  UIKit                               0x00315bc0 -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 2097
    30  UIKit                               0x0031a667 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 824
    31  UIKit                               0x0032ef92 -[UIApplication handleEvent:withNewEvent:] + 3517
    32  UIKit                               0x0032f555 -[UIApplication sendEvent:] + 85
    33  UIKit                               0x0031c250 _UIApplicationHandleEvent + 683
    34  GraphicsServices                    0x038d1f02 _PurpleEventCallback + 776
    35  GraphicsServices                    0x038d1a0d PurpleEventCallback + 46
    36  CoreFoundation                      0x01857ca5 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 53
    37  CoreFoundation                      0x018579db __CFRunLoopDoSource1 + 523
    38  CoreFoundation                      0x0188268c __CFRunLoopRun + 2156
    39  CoreFoundation                      0x018819d3 CFRunLoopRunSpecific + 467
    40  CoreFoundation                      0x018817eb CFRunLoopRunInMode + 123
    41  UIKit                               0x00319d9c -[UIApplication _run] + 840
    42  UIKit                               0x0031bf9b UIApplicationMain + 1225
    43  ToDoList                            0x00004e0d main + 141
    44  libdyld.dylib                       0x01e25701 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

具有讽刺意味的是,如果将其放在 viewDidLoad 方法末尾的行下方,那么它可以工作。

self.dbManager = [[DBManager alloc] initWithDatabaseFilename:@"todotaskdb.sql"];

谁能告诉我我做错了什么?

【问题讨论】:

您正在尝试调用 NSArray 的 itemName 方法。您正在 cellForRowAtIndexPath 中进行操作。 您的应用在XYZToDoListTableViewController 中的tableView:cellForRowAtIndexPath: 方法中崩溃。你能发布它的代码吗? @Michał, code - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath // 配置单元格... UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: @"ListPrototypeCell" forIndexPath:indexPath]; XYZToDoItem *toDoItem = [self.toDoItems objectAtIndex:indexPath.row]; cell.textLabel.text = toDoItem.itemName; if(toDoItem.completed) cell.accessoryType = UITableViewCellAccessoryCheckmark; else cell.accessoryType = UITableViewCellAccessoryNone; 返回单元格; code cell.textLabel.text = toDoItem.itemName; 之前尝试记录toDoItem 是什么类型的东西。错误消息说它是一个可变数组。 请编辑您的问题并以正确的格式添加此代码。它将更具可读性,您可以获得更好的答案。 【参考方案1】:

您的toDoItems 包含包含您的项目的数组!您可能会在数据库中获取单行数组,因此您必须先将它们填充到单个 toDoItems 对象中。

也许您可以使用类似工厂的模式和 popToDoItemFromRow:(NSArray *)row 之类的方法,该方法返回您的 toDoItem 为这一行。

然后在 (NSArray *subArray in dbResultArray) 中为这些单行填充一个新数组。这个新数组你应该用在你cellForRow...

可能像..

    - (void) loadInitialData

    // Form the query.
    NSString *query = @"select * from tasklist";

    // Get the results.
    if (self.toDoItems != nil) 
        self.toDoItems = nil;
    

    NSArray *dbResultArray = [[NSArray alloc] initWithArray:[self.dbManager loadDataFromDB:query]];

    if (self.toDoItems) 
        [self.toDoItems removeAllObjects];
    
    else 
        self.toDoItems = [NSMutableArray new];
    

    for(NSArray *subArray in dbResultArray) 
        [self.toDoItems addObject:[ToDoItem popToDoItemFromRow:subArray]];
    

    // Reload the table view.
    //[self.tblPeople reloadData];
    [self.tableView reloadData];

【讨论】:

以上是关于由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'-[__NSArrayM itemName]:无法识别的选择器发送到实例的主要内容,如果未能解决你的问题,请参考以下文章

由于未捕获的异常而终止应用程序 [UIImageView _isResizable]

由于未捕获的异常而终止应用程序,同时加载视图

由于未捕获的异常“NSInternalInconsistencyException”错误而终止应用程序

“由于未捕获的异常而终止应用程序”在推送视图控制器时崩溃

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,

由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序