2016-02-05 41 views
5

Di seguito è riportato lo stacktrace di un arresto anomalo che si verifica in una delle mie app. Non ho idea di come ripararlo e non sempre succede? PER FAVORE AIUTO :)Incidente "Specialized" Swift

Ha qualcosa a che fare con Swift Generics?

Thread : Crashed: com.apple.main-thread 
0 MyApp       0x1000f4f5c specialized FriendsTableViewController.tableView(UITableView, cellForRowAtIndexPath : NSIndexPath) -> UITableViewCell (FriendsTableViewController.swift) 
1 MyApp       0x1000f1f60 @objc FriendsTableViewController.tableView(UITableView, cellForRowAtIndexPath : NSIndexPath) -> UITableViewCell (FriendsTableViewController.swift) 
2 UIKit       0x1867ad31c -[UITableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:] + 692 
3 UIKit       0x1867ad484 -[UITableView _createPreparedCellForGlobalRow:willDisplay:] + 80 
4 UIKit       0x18679c9b8 -[UITableView _updateVisibleCellsNow:isRecursive:] + 2824 
5 UIKit       0x186539208 -[UITableView _setNeedsVisibleCellsUpdate:withFrames:] + 240 
6 UIKit       0x1865390d0 -[UITableView _rectChangedWithNewSize:oldSize:] + 996 
7 UIKit       0x186546df4 -[UITableView setBounds:] + 256 
8 UIKit       0x18647a2bc -[UIScrollView setContentOffset:] + 424 
9 UIKit       0x1865382bc -[UITableView setContentOffset:] + 300 
10 UIKit       0x186780a3c -[UIScrollView(UIScrollViewInternal) _adjustContentOffsetIfNecessary] + 60 
11 UIKit       0x18677ab5c -[UIScrollView _updateForChangedScrollRelatedInsets] + 48 
12 UIKit       0x18651d5ac -[UIScrollView setContentInset:] + 116 
13 UIKit       0x186546c50 -[UITableView setContentInset:] + 132 
14 UIKit       0x1865bf250 -[UIScrollView(UIScrollViewInternal) _adjustForAutomaticKeyboardInfo:animated:lastAdjustment:] + 348 
15 UIKit       0x1865bf0b8 -[UITableView _adjustForAutomaticKeyboardInfo:animated:lastAdjustment:] + 108 
16 UIKit       0x186d50380 -[UIAutoRespondingScrollViewControllerKeyboardSupport _adjustScrollViewForKeyboardInfo:] + 288 
17 Foundation      0x18211e44c __NSFireDelayedPerform + 428 
18 CoreFoundation     0x1817215f4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 28 
19 CoreFoundation     0x181721298 __CFRunLoopDoTimer + 884 
20 CoreFoundation     0x18171e9ac __CFRunLoopRun + 1520 
21 CoreFoundation     0x18164d680 CFRunLoopRunSpecific + 384 
22 GraphicsServices    0x182b5c088 GSEventRunModal + 180 
23 UIKit       0x1864c4d90 UIApplicationMain + 204 
24 MyApp       0x100094ef8 main (AppDelegate.swift:15) 
25 libdispatch.dylib    0x1811ee8b8 (Missing 

Insieme a questo, questa è la funzione cellForRow che ho

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    if indexPath.section < 2 { 
     let cell = tableView.dequeueReusableCellWithIdentifier("FriendCell", forIndexPath: indexPath) as! FriendTableViewCell 
     cell.tag = indexPath.row 

     var user: TetherUser! 

     if searching { 
      user = searchedUsers[indexPath.row] 
     } else { 
      if indexPath.section == 0 { 
       user = users[indexPath.row] 
       cell.actionButton.friendIsContact = false 
      } else if indexPath.section == 1 { 
       user = contactsWithApp[indexPath.row] 
       cell.actionButton.friendIsContact = true 
      } 
     } 

     user.tag = indexPath.row 

     cell.nameLabel.text = user.fullName 
     cell.profileImageView.image = nil 
     user.profileImage { (image) -> Void in 
      if user.tag == cell.tag { 
       cell.profileImageView.image = image 
      } 
     } 

     if let currentUserID = TetherManager.sharedInstance.currentTetherUser?.objectId { 
      cell.actionButton.type = user.relationToUserWithID(currentUserID) 
      cell.actionButton.tag = indexPath.row 
      cell.actionButton.delegate = self 
      switch user.relationToUserWithID(currentUserID) { 
      case .None: 
       cell.actionButton.button.setImage(UIImage(named: "AddFriend"), forState: .Normal) 
       break 
      case .SentFriendRequest: 
       cell.actionButton.button.setImage(UIImage(named: "ReceivedFriendRequest"), forState: .Normal) 
       break 
      case .ReceivedFriendRequest: 
       cell.actionButton.button.setImage(UIImage(named: "PendingFriendRequest"), forState: .Normal) 
       break 
      case .Friends: 
       cell.actionButton.button.setImage(UIImage(named: "RemoveFriend"), forState: .Normal) 
       break 
      } 
     } 
     return cell 
    } else { 
     //Contacts 
     let cell = tableView.dequeueReusableCellWithIdentifier("ContactCell", forIndexPath: indexPath) as! ContactTableViewCell 
     cell.contact = addressBookContacts[indexPath.row] 
     cell.delegate = self 
     return cell 
    } 
} 
+0

Quante sezioni ci sono nella visualizzazione tabella? – Shripada

+0

@Shripada scusa 3 sezioni – Phil

+0

OK, ora è chiaro perché potrebbe bloccarsi. Si osservi che non si sta caricando l'oggetto utente per il caso indexPath.section == 2. Gestirlo. – Shripada

risposta

1

Sarà necessario creare l'oggetto utente per il caso in cui indexPath.section == 2 quando si dispone di 3 sezioni . Sarà necessario verificare che l'oggetto 'user' è correttamente inizializzato in questo blocco di codice (vedi commento in linea nel codice)

var user: TetherUser! 

    if searching { 
     user = searchedUsers[indexPath.row] 
    } else { 
     if indexPath.section == 0 { 
      user = users[indexPath.row] 
      cell.actionButton.friendIsContact = false 
     } else if indexPath.section == 1 { 
      user = contactsWithApp[indexPath.row] 
      cell.actionButton.friendIsContact = true 
     } else if indexPath.section == 2 { 
     // Add code here to ensure user has proper value. 
     } 
    } 
+0

Ho appena trovato strano come ciò avvenga in modo incongruo. 1. Che cosa significa specialistica – Phil

+0

2. Perché non dovrei ottenere un "indice fuori limite" nella traccia dello stack? @shripada – Phil

+0

Non è un problema di indice fuori dai limiti. È vero che il registro degli arresti anomali avrebbe potuto essere più utile, dicendo che stai accedendo a una var involontariamente non inizializzata. – Shripada

0

ho questo errore "specializzato" anche. Gli arresti anomali si verificano solo su iOS 8.0 e 8.1. Questa è una parte della mia traccia di stack.

Crashed: com.apple.main-thread 
0 Viki       0x10027bb28 specialized LoginFlowSocialButton.traitCollectionDidChange(UITraitCollection?) ->() + 4297243432 
1 Viki       0x10027ad30 @objc LoginFlowSocialButton.traitCollectionDidChange(UITraitCollection?) ->() (LoginFlowButton.swift) 
2 UIKit       0x18a696cd4 -[UIView _processTraitsDidChangeRecursively:forceNotification:] + 124 
3 UIKit       0x18a3d05f4 __45-[UIView(Hierarchy) _postMovedFromSuperview:]_block_invoke + 348 
4 UIKit       0x18a3d0408 -[UIView(Hierarchy) _postMovedFromSuperview:] + 484 
5 UIKit       0x18a3dbea4 -[UIView(Internal) _addSubview:positioned:relativeTo:] + 1724 
6 UIKit       0x18a694f34 -[UIView initWithCoder:] + 756 
... 

Provo a scaricare uno dei simulatori iOS con quelle versioni e riprovare. Risulta che l'arresto anomalo proviene dall'utilizzo di una var non forzata ma ha trovato la funzione nil nella funzione traitCollectionDidChange.

Quindi la lezione qui è solo che la funzione specialized nel messaggio di errore potrebbe non puntare al problema esatto. Puoi provare a guardare più in quella funzione e vedere cosa è andato storto lì dentro.

Spero che questo aiuti. :)