有人可以解释为什么这会在iOS 4.2上崩溃吗?

时间:2010-11-04 16:28:27

标签: cocoa-touch ios4 gdb ipad

代码在iOS 3.2和4.2中运行时不断崩溃。

这是它崩溃的线。

NSArray* address = [NSArray arrayWithArray:[[[access.filteredResults objectAtIndex:[indexPath row]] addressArray] objectAtIndex:0]];

2010-11-04 12:20:03.060 ContactMapper[2211:207] -[__NSCFDictionary  getObjects:range:]: unrecognized selector sent to instance 0x5648e30
2010-11-04 12:20:03.062 ContactMapper[2211:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary getObjects:range:]: unrecognized selector sent to instance 0x5648e30'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x0117abe9 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x012cf5c2 objc_exception_throw + 47
    2   CoreFoundation                      0x0117c6fb -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
    3   CoreFoundation                      0x010ec366 ___forwarding___ + 966
    4   CoreFoundation                      0x010ebf22 _CF_forwarding_prep_0 + 50
    5   CoreFoundation                      0x01176605 -[NSArray initWithArray:range:copyItems:] + 245
    6   CoreFoundation                      0x010e1367 +[NSArray arrayWithArray:] + 119
    7   ContactMapper                       0x00003a8d -[RootViewController tableView:cellForRowAtIndexPath:] + 1333
    8   UIKit                               0x0033a7fa -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:] + 634
    9   UIKit                               0x0033077f -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:] + 75
    10  UIKit                               0x00345450 -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow:] + 1561
    11  UIKit                               0x0033d538 -[UITableView layoutSubviews] + 242
    12  QuartzCore                          0x01fc2451 -[CALayer layoutSublayers] + 181
    13  QuartzCore                          0x01fc217c CALayerLayoutIfNeeded + 220
    14  UIKit                               0x005c7702 -[UISplitViewController willRotateToInterfaceOrientation:duration:] + 1134
    15  UIKit                               0x00373df2 -[UIViewController window:willRotateToInterfaceOrientation:duration:] + 962
    16  UIKit                               0x002edee5 -[UIWindow _setRotatableClient:toOrientation:updateStatusBar:duration:force:] + 1783
    17  UIKit                               0x002e8538 -[UIWindow _setRotatableViewOrientation:duration:force:] + 89
    18  UIKit                               0x002eb643 -[UIWindow _updateInterfaceOrientationFromDeviceOrientation:] + 164
    19  Foundation                          0x000306c1 _nsnote_callback + 145
    20  CoreFoundation                      0x01152f99 __CFXNotificationPost_old + 745
    21  CoreFoundation                      0x010d233a _CFXNotificationPostNotification + 186
    22  Foundation                          0x00026266 -[NSNotificationCenter postNotificationName:object:userInfo:] + 134
    23  UIKit                               0x00477d0a -[UIDevice setOrientation:animated:] + 228
    24  UIKit                               0x002c9637 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 656
    25  UIKit                               0x002d3db2 -[UIApplication handleEvent:withNewEvent:] + 1533
    26  UIKit                               0x002cc202 -[UIApplication sendEvent:] + 71
    27  UIKit                               0x002d1732 _UIApplicationHandleEvent + 7576
    28  GraphicsServices                    0x01ab0a36 PurpleEventCallback + 1550
    29  CoreFoundation                      0x0115c064 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
    30  CoreFoundation                      0x010bc6f7 __CFRunLoopDoSource1 + 215
    31  CoreFoundation                      0x010b9983 __CFRunLoopRun + 979
    32  CoreFoundation                      0x010b9240 CFRunLoopRunSpecific + 208
    33  CoreFoundation                      0x010b9161 CFRunLoopRunInMode + 97
    34  UIKit                               0x002c8fa8 -[UIApplication _run] + 636
    35  UIKit                               0x002d542e UIApplicationMain + 1160
    36  ContactMapper                       0x00002638 main + 102
    37  ContactMapper                       0x000025c9 start + 53
)
terminate called after throwing an instance of 'NSException'

3 个答案:

答案 0 :(得分:0)

乍一看,这一行就是你的问题:

[NSArray initWithArray:range:copyItems:]
乍一看,可能是你需要indexPath.row而不是[indexPath row]。

因为iOS 4.2仍然在NDA下,所以我们不能谈论4.2特定的代码。 但是,我们可以谈谈4.1和之前的事情。

首先,在登录iOS开发人员中心后,您将转到4.2差异页面。这将告诉您该版本中的更改。由于这些页面仅显示要发布的版本,请查看3.2-4.0差异,4.0-4.1和4.1-4.2差异。您正在寻找UITableView或NSArray的API更改,这显然无法在此处讨论。

其次,您将在崩溃报告中下载WWDC '10会话。这有点单调乏味,但花在学习如何阅读崩溃报告上的时间非常值得。

希望这有帮助!

答案 1 :(得分:0)

您收到的错误告诉您选择器getObjects:range:正在发送给__NSCFDictionary。显然如下:

[[[access.filteredResults objectAtIndex:[indexPath row]] addressArray] objectAtIndex:0]

...用于返回NSArray,但现在返回NSDictionary。

我不知道access是什么,所以我不知道还有什么可以说的,除了你可以将你引用的行作为错误来源改为:

NSDictionary* address = [NSDictionary dictionaryWithDictionary:[[[access.filteredResults objectAtIndex:[indexPath row]] addressArray] objectAtIndex:0]];

完成后,无论使用address后面的任何代码,都需要更改以处理您不再访问数组的事实。

答案 2 :(得分:-1)

您需要新的iOS CookBook代码