2011-05-01 64 views
0

我收到了第一份崩潰報告,但我無法弄清楚問題所在。幸運的是,由於這次崩潰來自我的同事,我可以直接在他的iPhone上測試錯誤,並在他的手機上安裝開發版本。如何調試iPhone應用程序崩潰日誌。僅在App Store購買的版本中崩潰,未開發

然而,奇怪的是,當我從我的電腦上安裝並在他的設備上運行開發版本時,沒有崩潰; 只有當應用程序從App Store下載並安裝時纔會出現崩潰。 到目前爲止,我無法在任何其他設備上重現錯誤(受影響的設備是iPhone 3G固件4.2.1,所有操作系統運行速度都很慢)。該行被從一個UITableViewController(ItemsListTableViewController)中選擇,在這點的細節視圖應該出現後

所述的碰撞發生,但詳細視圖(ItemDetailViewController)的viewDidLoad中施工中應用程序崩潰。

尤其是該問題似乎在類LocationPathView(ItemDetailViewController視圖的子視圖)中進行了本地化。 ItemDetailViewController是UITableViewController的子類,並從viewDidLoad中的nib中加載其tableHeaderView:
[[NSBundle mainBundle] loadNibNamed:@「ItemDetailHeaderView」owner:self options:nil]; (LocationPathView是tableHeaderView的一部分)

當筆尖文件被加載,LocationPathView :: awakeFromNib稱爲然後LocationPathView :: layoutSubviews被調用。崩潰似乎源於layoutSubviews。 在layoutSubviews內我執行動畫: [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:0.2]; 由於某些原因,此動畫可能會因慢速設備崩潰而創建嗎?在layoutSubviews中動畫是否正確?

我會感謝任何幫助,
馬爾科

Date/Time:  2011-04-30 12:50:36.972 +0200 
OS Version:  iPhone OS 4.2.1 (8C148) 
Report Version: 104 

Exception Type: EXC_CRASH (SIGABRT) 
Exception Codes: 0x00000000, 0x00000000 
Crashed Thread: 0 

Thread 0 Crashed: 
0 libSystem.B.dylib    0x35de3ad0 __kill + 8 
1 libSystem.B.dylib    0x35de3abe kill + 4 
2 libSystem.B.dylib    0x35de3ab2 raise + 10 
3 libSystem.B.dylib    0x35dfad5e abort + 54 
4 libstdc++.6.dylib    0x374f2a00 __gnu_cxx::__verbose_terminate_handler() + 588 
5 libobjc.A.dylib     0x32d9d8d8 _objc_terminate + 160 
6 libstdc++.6.dylib    0x374f0100 __cxxabiv1::__terminate(void (*)()) + 76 
7 libstdc++.6.dylib    0x374f0178 std::terminate() + 16 
8 libstdc++.6.dylib    0x374f02a0 __cxa_throw + 100 
9 libobjc.A.dylib     0x32d9bf28 objc_exception_throw + 104 
10 CoreFoundation     0x3759dabc +[NSException raise:format:arguments:] + 64 
11 CoreFoundation     0x3759daf0 +[NSException raise:format:] + 24 
12 QuartzCore      0x33d9409c CALayerSetPosition(CALayer*, CA::Vec2<double> const&, bool) + 180 
13 QuartzCore      0x33d93fd8 -[CALayer setPosition:] + 40 
14 QuartzCore      0x33d93efc -[CALayer setFrame:] + 444 
15 UIKit       0x358d92c8 -[UIView(Geometry) setFrame:] + 248 
16 UIKit       0x3592dde0 -[UIButton setFrame:] + 120 
17 MyApp      0x0003432a -[LocationPathView layoutSubviews] (LocationPathView.m:101) <<<<<<<<<<<<<<<<<<<<<<<<<<< 
18 UIKit       0x358ec704 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 32 
19 CoreFoundation     0x37538f72 -[NSObject(NSObject) performSelector:withObject:] + 18 
20 QuartzCore      0x33d9a128 -[CALayer layoutSublayers] + 176 
21 QuartzCore      0x33d99db0 CALayerLayoutIfNeeded + 192 
22 QuartzCore      0x33d99cd8 -[CALayer layoutIfNeeded] + 108 
23 UIKit       0x3598ee38 -[UIView(Hierarchy) layoutIfNeeded] + 24 
24 UIKit       0x359fbabc -[UIButton titleLabel] + 76 
25 MyApp      0x0001fee8 -[ItemDetailViewController viewDidLoad] (ItemDetailViewController.m:148)  <<<<<<<<<<<<<<<<<<<<<<<<<<< 
26 UIKit       0x35926e58 -[UIViewController view] + 152 
27 UIKit       0x35937f2c -[UIViewController contentScrollView] + 24 
28 UIKit       0x35937d4c -[UINavigationController _computeAndApplyScrollContentInsetDeltaForViewController:] + 36 
29 UIKit       0x35937bf8 -[UINavigationController _layoutViewController:] + 28 
30 UIKit       0x35937474 -[UINavigationController _startTransition:fromViewController:toViewController:] + 336 
31 UIKit       0x35937288 -[UINavigationController _startDeferredTransitionIfNeeded] + 256 
32 UIKit       0x35926c44 -[UINavigationController pushViewController:transition:forceImmediate:] + 904 
33 UIKit       0x359268a8 -[UINavigationController pushViewController:animated:] + 36 
34 MyApp      0x00020a9a -[ItemsListTableViewController viewItemDetail:startEditable:] (ItemsListTableViewController.m:717) 
35 MyApp      0x00022110 -[ItemsListTableViewController tableView:didSelectRowAtIndexPath:] (ItemsListTableViewController.m:241) <<<<<<<<<<<<<<<<<<<<<<<<<<< 
36 UIKit       0x3595bf4c -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 884 
37 UIKit       0x35a5da9c -[UITableView _userSelectRowAtPendingSelectionIndexPath:] + 196 
38 Foundation      0x351724d4 __NSFireDelayedPerform + 360 
39 CoreFoundation     0x375522fe __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 10 
40 CoreFoundation     0x37551cd2 __CFRunLoopDoTimer + 982 
41 CoreFoundation     0x37521a8a __CFRunLoopRun + 1178 
42 CoreFoundation     0x37521504 CFRunLoopRunSpecific + 220 
43 CoreFoundation     0x37521412 CFRunLoopRunInMode + 54 
44 GraphicsServices    0x33e76d1c GSEventRunModal + 188 
45 UIKit       0x3591d574 -[UIApplication _run] + 580 
46 UIKit       0x3591a550 UIApplicationMain + 964 
47 MyApp      0x00002fce main (main.m:14) 
48 MyApp      0x00002f98 0x1000 + 8088 

ItemsListTableViewController.m:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    Item *item = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
    [self viewItemDetail:item startEditable:NO]; <<<<<<<<<<<<<<<<<<< 
} 


- (void)viewItemDetail:(Item *)item startEditable:(BOOL)editable { 
    ItemDetailViewController *controller = [[ItemDetailViewController alloc] initWithStyle:UITableViewStyleGrouped showItem:item inItemsList:[self.fetchedResultsController fetchedObjects]]; 

    if (editable) 
     controller.editing = YES; 

    [self.navigationController pushViewController:controller animated:YES]; <<<<<<<<<<<<<<<<<<< 
    [controller release]; 
} 

ItemDetailViewController.m:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.navigationItem.title = NSLocalizedString(@"Item details", @"Item details"); 
    self.navigationItem.rightBarButtonItem = self.editButtonItem; 

    self.view.backgroundColor = [UIColor groupTableViewBackgroundColor]; 

    // Configure the tableview 
    self.tableView.sectionFooterHeight = 5.0f; 
    self.tableView.allowsSelectionDuringEditing = YES; 

    // Create and set the tableview header 
    if (headerView == nil) { 
     [[NSBundle mainBundle] loadNibNamed:@"ItemDetailHeaderView" owner:self options:nil]; <<<<<<<<<<<<<<<<<<<<<<<<<<< 

     // Item title button 
     itemTitleButton.titleLabel.adjustsFontSizeToFitWidth = YES; 
     itemTitleButton.titleLabel.minimumFontSize = 11.0f; 
     [itemTitleButton setImageEdgeInsets:UIEdgeInsetsMake(0.0f, itemTitleButton.bounds.size.width-29.0f, 0.0f, 0.0f)]; 
     [itemTitleButton setTitleEdgeInsets:UIEdgeInsetsMake(0.0f, 0.0f, 0.0f, 24.0f)]; 
     UIImage *normalImage = [[UIImage imageNamed:@"objectNameHighlighedButton.png"] stretchableImageWithLeftCapWidth:11 topCapHeight:0]; 
     [self.itemTitleButton setBackgroundImage:normalImage forState:UIControlStateHighlighted]; 

     [pathView addTarget:self action:@selector(moveButtonTouchUp:) forControlEvents:UILocationPathViewMoveControlEvent]; 

     // Check if the item's path should be recalculated 
     if (pathView.pathList == nil) { 
      pathView.pathList = pathNames; 
     } 

     self.tableView.tableHeaderView = headerView; 

     // Save initial header height so that it can be restore navigating between items with different flags count 
     tableHeaderFrameHeight = headerView.frame.size.height; 
    } 


    // Enable the UIToolbar at the bottom of the view controller and create its buttons 
    [self.navigationController setToolbarHidden:NO animated:YES]; 
    self.navigationController.toolbar.barStyle = UIBarStyleBlack; 
    self.navigationController.toolbar.translucent = YES; 

    // [omitted part]: create toolbar items … 

    // Restore editing status if the view was unloaded 
    if (viewUnloaded && self.editing) { 
     viewUnloaded = NO; 
     // this will force setEditing:YES to be called on all tableView's subviews! (categorySectionHeaderView...) 
     [self.tableView setEditing:YES]; 
     // ...not for tableheader! 
     editableImageView.editing = YES; 
     pathView.editing = YES; 
    } 

    // Recreate item flags 
    CGRect headerFrame = headerView.frame; 
    for (FlaggedItem *flagObject in self.itemBookmarkRibbons) { 
     headerFrame.size.height += ITEM_SHEET_FLAG_BUTTON_HEIGHT + 8.0f; 
     headerView.frame = headerFrame; 

     UIButton *bookmarkRibbon = [self createBookmarkRibbon:flagObject]; 
     bookmarkRibbon.frame = CGRectMake(0.0f, headerFrame.size.height-ITEM_SHEET_FLAG_BUTTON_HEIGHT-8.0f, 
             headerFrame.size.width, ITEM_SHEET_FLAG_BUTTON_HEIGHT); 

     [headerView addSubview:bookmarkRibbon]; 
     [headerView sendSubviewToBack:bookmarkRibbon]; 
    } 

    // Update the table header view height 
    self.tableView.tableHeaderView = headerView; 
} 

LocationPathView.m:

- (void)awakeFromNib { 
    [super awakeFromNib]; 

    UIColor *color = [[UIColor alloc] initWithWhite:0.0f alpha:0.0f]; 
    self.backgroundColor = color; 
    [color release]; 

    [self sendSubviewToBack:backgroundView]; 
    // create imageview rounded rect 
    CALayer *l = [backgroundView layer]; 
    [l setMasksToBounds:YES]; 
    [l setCornerRadius:10.0]; 
    [l setBorderWidth:2.0]; 
    UIColor *borderColor = [[UIColor alloc] initWithWhite:0.65 alpha:1.0]; 
    [l setBorderColor:[borderColor CGColor]]; 
    [borderColor release]; 

    expanded = NO; 
    buttons = [[NSMutableArray alloc] initWithCapacity:2]; 
    [buttons addObject:[self createButtonOfType:PVButtonTypeStart]]; 
    [buttons addObject:[self createButtonOfType:PVButtonTypeEnd]]; 
} 


- (void)layoutSubviews { 
#define MOVE_BUTTON_WIDTH  90.0f 
#define STANDARD_BUTTON_HEIGHT 22.0f 

    [super layoutSubviews]; 

    CGRect contentRect = self.frame; 
    if (CGRectIsEmpty(contentRect)) 
     return; 

    if ([buttons count] != [pathList count] && [pathList count] > 0) { 
     [self prepareButtons]; 
    } 


    [UIView beginAnimations:nil context:nil]; <<<<<<<<<<<<<<<<<<< 
    [UIView setAnimationDuration:0.2]; 

    CGFloat x = 0.0f, y = 0.0f; 
    CGFloat availableHSpace = 0.0f; 
    UIButton *button; 

    for (NSUInteger i=0; i<[self.buttons count]; i++) { 
     button = [buttons objectAtIndex:i]; 

     if (self.isExpanded == NO && i > 0 && i <= [self.buttons count]-2) 
      // hide all middle buttons 
      button.alpha = 0.0f; 
     else { 
      button.alpha = 1.0f; 
      NSString *title = [pathList objectAtIndex:i]; 
      CGSize size = [title sizeWithFont:button.titleLabel.font]; 

      CGFloat buttonWidth = size.width + 36.0f; 
      // check if the button width is greater than available space, if yes set the button width equal to the available space. 
      // The available space is reduced in editing move to make room for the move button. 
      if (self.editing && moveButton) 
       availableHSpace = contentRect.size.width - MOVE_BUTTON_WIDTH - 3.0f - 10.0f; // 10.0=space from move button 
      else 
       availableHSpace = contentRect.size.width; 

      if (x + buttonWidth > availableHSpace) 
       buttonWidth = availableHSpace - x; 

      button.frame = CGRectMake(x, y, buttonWidth, STANDARD_BUTTON_HEIGHT); 
      [button setTitle:title forState:UIControlStateNormal]; 
      y += STANDARD_BUTTON_HEIGHT + 3.0f; // vertical distance between buttons 
     } 

     if (self.isExpanded) 
      x += 14.0f; // indentation 
    } 

    // setup cyan background 
    backgroundView.alpha = (self.isExpanded ? 0.80f : 0.0f); 
    CGRect backgroundViewFrame = backgroundView.frame; 
    if (self.isExpanded) { 
     // 10.0 = 5.0=y gap between backgroundView and self + 5.0=distance between edge 
     backgroundViewFrame.size.height = button.frame.origin.y + button.frame.size.height + 12.0f; 
    } 
    else 
     backgroundViewFrame.size.height = self.frame.size.height; 

    backgroundView.frame = backgroundViewFrame; 

    [UIView commitAnimations]; 

    // set moveButton position and make it visible (put it out of animation block to avoid frame changing animation, 
    // fade animation already set from caller) 
    if (self.editing && moveButton) { 
     moveButton.frame = CGRectMake(0.0f, 0.0f, MOVE_BUTTON_WIDTH, STANDARD_BUTTON_HEIGHT*2 + 3.0f); // 3.0=vertical space between buttons 
     moveButton.center = CGPointMake(contentRect.size.width - MOVE_BUTTON_WIDTH/2 - 3.0f, contentRect.size.height/2); 
     moveButton.hidden = NO; 
    } 
} 

回答

1

作爲一個錯誤,只有應用商店版本讓我懷疑用於構建提交二進制文件的項目或目標設置。

您是否使用項目配置來構建提交二進制文件?如果是這樣,我會尋找的第一件事情是一個C宏定義錯誤的發佈版本。或者,在項目層面可能是正確的,但在目標層面是不正確的。也許你的動畫塊的末尾沒有正確的信號?

使用與應用商店版本完全相同的設置構建應用程序的臨時版本將是一個很好的測試。 (代碼簽名將是唯一的區別。)從設備中刪除舊的應用程序,並通過iTunes以艱難的方式部署它,以確保它。

+0

我以標準方式構建我的發行版:我在Build Settings - > Code Signing Identity中選擇了我的發行版配置文件,以進行調試和發佈行,然後產品 - >存檔。尚未使用特設版本進行測試,我將盡快發佈結果 – ggould75 2011-05-06 07:13:56

+0

類似的事情發生在我身上。特別是爲UITableView中的節標題創建一個UIView。如果我存檔並「共享」我的應用程序,然後將它安裝在iPhone 4上,一切都很好。如果我「提交」相同的版本,我得到這個: CALayerInvalidGeometry',原因:'CALayer範圍包含NaN: – Antonio 2011-05-17 11:15:09

0

這可能是你的動畫塊阻塞運行背後的主要過渡。儘量避免這種情況。例如popAviewController,在推另一個這種情況之後就會導致崩潰,因爲在上一個完成前你正在做另一個轉換。希望你能理解。

+0

對於「主要轉換」,你是指由pushViewController啓動的動畫:animated:?你應該在哪裏建議把我的動畫,而不是layoutSubviews? – ggould75 2011-05-01 10:48:01

+0

僅僅在轉換完成後 – 2011-05-01 12:53:40