Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift "Specialized" Crash

Below is the stacktrace of a crash that keeps occurring in one of my apps. I have no clue how to fix it and it doesn't always happen? PLEASE HELP :)

Does it have something to do with 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

Along with this, this is the cellForRow function that I have

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
    }
}
like image 313
Phil Avatar asked Feb 05 '16 01:02

Phil


2 Answers

You will need to create the User object for the case for when indexPath.section == 2 as you have 3 sections. You will need to ensure the 'user' object is properly initialised in this code block (refer to inline comment in the code)

    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.
        }
    }
like image 161
Shripada Avatar answered Nov 01 '22 04:11

Shripada


I have this "specialized" error also. The crashes only happen on iOS 8.0 and 8.1. This is a part of my stack trace.

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
...

I try downloading one of iOS simulators with those versions and test again. Turns out the crash is from using a forced unwrapped var but found nil in traitCollectionDidChange function.

So the lesson here is just that the specialized function in the error message may not point to the exact problem. You can try look more into that function and see what went wrong in there.

Hope that helps. :)

like image 25
Hlung Avatar answered Nov 01 '22 02:11

Hlung