Hypergater
Hypergater

Reputation: 649

Terminating app due to uncaught exception 'NSInvalidArgumentException Xcode 9.1 / iPhone X

my app works perfectly on my iPhone device and iPad, as well as all simulators and iOS except on the iPhone X simulator... It crashes out before the app starts with the following error log;

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[0]'

*** First throw call stack:
(
    0   CoreFoundation                      0x00000001127aa1ab __exceptionPreprocess + 171
    1   libobjc.A.dylib                     0x000000011078af41 objc_exception_throw + 48
    2   CoreFoundation                      0x00000001127e9f9c _CFThrowFormattedException + 194
    3   CoreFoundation                      0x00000001126beb41 -[__NSPlaceholderDictionary initWithObjects:forKeys:count:] + 321
    4   CoreFoundation                      0x000000011281d11b __createDictionary + 43
    5   CoreFoundation                      0x0000000112728cff +[NSDictionary dictionaryWithObject:forKey:] + 47
    6   ChristmasCountdown                  0x000000010dc776a4 -[Home viewDidLoad] + 20900
    7   UIKit                               0x0000000115cb38a5 -[UIViewController loadViewIfRequired] + 1235
    8   UIKit                               0x0000000115cfb1ec -[UINavigationController _updateScrollViewFromViewController:toViewController:] + 68
    9   UIKit                               0x0000000115cfb528 -[UINavigationController _startTransition:fromViewController:toViewController:] + 153
    10  UIKit                               0x0000000115cfc63f -[UINavigationController _startDeferredTransitionIfNeeded:] + 841
    11  UIKit                               0x0000000115cfd8c3 -[UINavigationController __viewWillLayoutSubviews] + 150
    12  UIKit                               0x0000000115f56a49 -[UILayoutContainerView layoutSubviews] + 231
    13  UIKit                               0x0000000115bdf6f5 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 1439
    14  QuartzCore                          0x0000000113b933ee -[CALayer layoutSublayers] + 153
    15  QuartzCore                          0x0000000113b974dd _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 401
    16  QuartzCore                          0x0000000113b1fded _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 365
    17  QuartzCore                          0x0000000113b4b704 _ZN2CA11Transaction6commitEv + 500
    18  UIKit                               0x0000000115b29d3a __34-[UIApplication _firstCommitBlock]_block_invoke_2 + 141
    19  CoreFoundation                      0x000000011274d18c __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12
    20  CoreFoundation                      0x000000011273196b __CFRunLoopDoBlocks + 203
    21  CoreFoundation                      0x0000000112731144 __CFRunLoopRun + 1300
    22  CoreFoundation                      0x00000001127309b9 CFRunLoopRunSpecific + 409
    23  GraphicsServices                    0x000000011467a9c6 GSEventRunModal + 62
    24  UIKit                               0x0000000115b0e5e8 UIApplicationMain + 159
    25  ChristmasCountdown                  0x000000010dc724df main + 111
    26  libdyld.dylib                       0x000000011594fd81 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

What I don't understand, is that the other simulators, work fine, phone and pad, and the same iOS version (11.1) so it seems specific to iPhoneX only...

viewDidLoad;

- (void)viewDidLoad {
    [super viewDidLoad];
   // Do any additional setup after loading the view.

    tag = 1000;
    str_Type = @"Current";

    //Set Navigation Bar Title
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 50)];
    label.backgroundColor = [UIColor clearColor];
    label.font = [UIFont boldSystemFontOfSize:20.0];
    label.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.5];
    label.textAlignment = NSTextAlignmentCenter;
    label.text = @"Christmas Countdown";
    label.textColor = [UIColor whiteColor];
    self.navigationItem.titleView = label;

    //Hide Not Required UILabel's
    lbl_Time.hidden = YES;
    lbl_Text.hidden = YES;
    lbl_Days.hidden = YES;
    lbl_DaysText.hidden = YES;
    lbl_Weeks.hidden = YES;
    lbl_WeeksText.hidden = YES;
    img_DividerImage.hidden = YES;

    //Initialize NSArray object with Images
    arr_OfSanta = @[[UIImage imageNamed:@"santa1"],[UIImage imageNamed:@"santa2"],[UIImage imageNamed:@"santa3"],[UIImage imageNamed:@"santa4"],[UIImage imageNamed:@"santa5"],[UIImage imageNamed:@"santa6"]];

    //Initialize arr_MusicFiles & arr_MusicText Array
    arr_MusicFiles = @[@"auld-lang-syne-piano",@"ave-maria",@"away-in-a-manger-epiano",@"carol-of-the-bells",@"come-from-stars",@"ding-dong-merrily",@"god-rest-ye-merry-gentlemen",@"herald",@"jingle-bells-country",@"joy-to-the-world",@"o-christmas-tree",@"o-come-all-ye-faithful",@"o-holy-night",@"silent-night-piano",@"we-wish-you-a-merry-christmas"];

    arr_MusicText = @[@"Auld Land Syne Piano",@"Ave Maria",@"Away In A Manger Epiano",@"Carol Of the Bells",@"Come From Stars",@"Ding Dong Merrily",@"God Rest ye Merry Gentlemen",@"Herald",@"Jingle Bells Country",@"Joy To the World",@"O Christmas Tree",@"O Come All Ye Faithful",@"O Holy Night",@"Silent Night Piano",@"We Wish You A Merry Christmas"];

    arr_OfCountryCode = @[@"AF",@"AL",@"DZ",@"AS",@"AD",@"AO",@"AI",@"AQ",@"AG",@"AR",@"AM",@"AW",@"AC",@"AU",@"AT",@"AZ",@"BS",@"BH",@"BD",@"BB",@"BY",@"BE",@"BZ",@"BJ",@"BM",@"BT",@"BO",@"BA",@"BW",@"BV",@"BR",@"IO",@"VG",@"BN",@"BG",@"BF",@"BI",@"KH",@"CM",@"CA",@"IC",@",CV",@"BQ",@"KY",@"CF",@"EA",@"TD",@"CL",@"CN",@"CX",@"CP",@"CC",@"CO",@"KM",@"CD",@"CG",@"CK",@"CR",@"HR",@"CU",@"CW",@"CY",@"CZ",@"CI",@"DK",@"DG",@"DJ",@"DM",@"DO",@"EC",@"EG",@"SV",@"GQ",@"ER",@"EE",@"ET",@"FK",@"FO",@"FJ",@"FI",@"FR",@"FG",@"PF",@"TF",@"GA",@"GM",@"GE",@"DE",@"GH",@"GI",@"GR",@"GL",@"GD",@"GP",@"GU",@"GT",@"GG",@"GN",@"GW",@"GY",@"HT",@"HM",@"HN",@"HK",@"HU",@"IS",@"IN",@"ID",@"IR",@"IQ",@"IE",@"IM",@"IL",@"IT",@"JM",@"JP",@"JE",@"JO",@"KZ",@"KE",@"KI",@"XK",@"KW",@"KG",@"LA",@"LV",@"LB",@"LS",@"LR",@"LY",@"LI",@"LT",@"LU",@"MO",@"MK",@"MG",@"MW",@"MY",@"MV",@"ML",@"MT",@"MH",@"MQ",@"MR",@"MU",@"YT",@"MX",@"FM",@"MD",@"MC",@"MN",@"ME",@"MS",@"MA",@"MZ",@"MM",@"NA",@"NR",@"NP",@"NL",@"NC",@"NZ",@"NI",@"NE",@"NG",@"NU",@"NF",@"KP",@"MP",@"NO",@"OM",@"PK",@"PW",@"PS",@"PA",@"PG",@"PY",@"PE",@"PH",@"PN",@"PL",@"PT",@"PR",@"QA",@"RO",@"RU",@"RW",@"RE",@"WS",@"SM",@"SA",@"SN",@"RS",@"SC",@"SL",@"SG",@"SX",@"SK",@"SI",@"SB",@"SO",@"ZA",@"GS",@"KR",@"SS",@"ES",@"LK",@"BL",@"SH",@"KN",@"LC",@"MF",@"PM",@"VC",@"SD",@"SR",@"SJ",@"SZ",@"SE",@"CH",@"SY",@"ST",@"TW",@"TJ",@"TZ",@"TH",@"TL",@"TG",@"TK",@"TO",@"TT",@"TA",@"TN",@"TR",@"TM",@"TC",@"TV",@"UM",@"VI",@"UG",@"UA",@"AE",@"GB",@"US",@"UY",@"UZ",@"VU",@"VA",@"VE",@"VN",@"WF",@"EH",@"YE",@"ZM",@"ZW",@"AX"];

    //UIView Width
    int width = self.view.frame.size.width;

    //Current Device Model
    NSString *deviceType = [UIDevice currentDevice].model;

    //this will load wether or not they bought the in-app purchase
    areAdsRemoved = [[NSUserDefaults standardUserDefaults] boolForKey:@"areAdsRemoved"];
    [[NSUserDefaults standardUserDefaults] synchronize];

    if ([deviceType isEqualToString:@"iPad"]) {
        if(areAdsRemoved){
             [self.scrolView_Bottom setConstant:0];

            //Hide BannerView
            self.bannerView.hidden = YES;
            self.btn_RemoveAds.hidden = YES;
            //if they did buy it, set the background to blue.

        } else {

            [self.scrolView_Bottom setConstant:100];

            //Display BannerView
            self.bannerView.hidden = NO;
        }

        //Set UIScrollView Content Size
        self.srl_ScrollView.frame = CGRectMake(0, self.srl_ScrollView.frame.origin.y, self.view.frame.size.width, 365);
        self.srl_ScrollView.contentSize = CGSizeMake(6*width, 365);
        [self scrollViewDidScroll:self.srl_ScrollView];

        //Set Font Text Size
        objFont = [UIFont boldSystemFontOfSize:20.0];

        //Adjust Constraints
        [self.view_Bottom setConstant:100];
        [self.img_Top setConstant:140];
        [self.btnLeft_Width setConstant:150];
        [self.btnLeft_Height setConstant:200];
        [self.btnRight_Height setConstant:200];
        [self.btnRight_Width setConstant:150];
        [self.bannerView_Height setConstant:100];

        //Set UILabel Font Size
        lbl_AllDays.font = [UIFont systemFontOfSize:30.0];
        lbl_AllHours.font = [UIFont systemFontOfSize:30.0];
        lbl_AllMinutes.font = [UIFont systemFontOfSize:30.0];
        lbl_AllSeconds.font = [UIFont systemFontOfSize:30.0];
        lbl_Time.font = [UIFont systemFontOfSize:55];
        lbl_Text.font = [UIFont systemFontOfSize:35];
        lbl_Weeks.font = [UIFont systemFontOfSize:55];
        lbl_WeeksText.font = [UIFont systemFontOfSize:35];
        lbl_Days.font = [UIFont systemFontOfSize:55];
        lbl_DaysText.font = [UIFont systemFontOfSize:35];

        //Add Images in UIScrollView
        self.img_ImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.srl_ScrollView.frame.size.height)];
        self.img_ImageView.contentMode = UIViewContentModeScaleAspectFit;
        self.img_ImageView.clipsToBounds = YES;
        self.img_ImageView.image = [arr_OfSanta objectAtIndex:0];
        [self.srl_ScrollView addSubview:self.img_ImageView];
    } else {

        if(areAdsRemoved){
            //Adjust UIScrollView Constraint
            [self.scrolView_Bottom setConstant:0];

            //Hide BannerView
            self.bannerView.hidden = YES;

            self.btn_RemoveAds.hidden = YES;
            //if they did buy it, set the background to blue.
        } else {
            //Adjust UIScrollView Constraint
            [self.scrolView_Bottom setConstant:50];

            //Display BannerView
            self.bannerView.hidden = NO;
        }

        //Current Device Screen Size
        int height = [[UIScreen mainScreen] bounds].size.height;

        //Set UILabelText Font Size, If Screen height 480
        if (height == 480) {
            //Set Font Text Size
            objFont = [UIFont boldSystemFontOfSize:9.0];

            //Set UIScrollView Content Size
            self.srl_ScrollView.frame = CGRectMake(0, self.srl_ScrollView.frame.origin.y, self.view.frame.size.width, 150);
            self.srl_ScrollView.contentSize = CGSizeMake(6*width, 150);

            //Adjust Constraints
            [self.img_Top setConstant:50];

            //Set UILabel Font Size
            lbl_AllDays.font = [UIFont systemFontOfSize:12.0];
            lbl_AllHours.font = [UIFont systemFontOfSize:12.0];
            lbl_AllMinutes.font = [UIFont systemFontOfSize:12.0];
            lbl_AllSeconds.font = [UIFont systemFontOfSize:12.0];
            lbl_Time.font = [UIFont systemFontOfSize:25];
            lbl_Text.font = [UIFont systemFontOfSize:15];
            lbl_Weeks.font = [UIFont systemFontOfSize:25];
            lbl_WeeksText.font = [UIFont systemFontOfSize:15];
            lbl_Days.font = [UIFont systemFontOfSize:25];
            lbl_DaysText.font = [UIFont systemFontOfSize:15];
        }

        //Change Divider Image Top, When screen size grater than 480
        if (height == 568) {
            //Set Font Text Size
            objFont = [UIFont boldSystemFontOfSize:9.0];

            //Set UIScrollView Content Size
            self.srl_ScrollView.frame = CGRectMake(0, self.srl_ScrollView.frame.origin.y, self.view.frame.size.width, 150);
            self.srl_ScrollView.contentSize = CGSizeMake(6*width, 150);

            [self.img_Top setConstant:70];
        } else if (height == 667) {
            //Set UIScrollView Content Size
            self.srl_ScrollView.frame = CGRectMake(0, self.srl_ScrollView.frame.origin.y, self.view.frame.size.width, 240);
            self.srl_ScrollView.contentSize = CGSizeMake(6*width, 240);

            //Set Font Text Size
            objFont = [UIFont boldSystemFontOfSize:11.0];
            [self.img_Top setConstant:90];
        } else if (height == 736) {
            //Set UIScrollView Content Size
            self.srl_ScrollView.frame = CGRectMake(0, self.srl_ScrollView.frame.origin.y, self.view.frame.size.width, 270);
            self.srl_ScrollView.contentSize = CGSizeMake(6*width, 270);

            objFont = [UIFont boldSystemFontOfSize:11.0];
            [self.img_Top setConstant:100];
        }

        //Add Images in UIScrollView
        self.img_ImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.srl_ScrollView.frame.size.height)];
        self.img_ImageView.contentMode = UIViewContentModeScaleAspectFit;
        self.img_ImageView.clipsToBounds = YES;
        self.img_ImageView.image = [arr_OfSanta objectAtIndex:0];
        [self.srl_ScrollView addSubview:self.img_ImageView];
    }

    //Hide MKMapView
    self.mapView.hidden = YES;

    //Zoom In & Zoom Out Animation
    [UIView animateWithDuration:0 animations:^{
        lbl_AllDays.transform = CGAffineTransformMakeScale(0.01, 0.01);
        lbl_AllHours.transform = CGAffineTransformMakeScale(0.01, 0.01);
        lbl_AllMinutes.transform = CGAffineTransformMakeScale(0.01, 0.01);
        lbl_AllSeconds.transform = CGAffineTransformMakeScale(0.01, 0.01);
    }completion:^(BOOL finished){
        // Finished scaling down imageview, now resize it
        [UIView animateWithDuration:0.8 animations:^{
            lbl_AllDays.transform = CGAffineTransformIdentity;
            lbl_AllHours.transform = CGAffineTransformIdentity;
            lbl_AllMinutes.transform = CGAffineTransformIdentity;
            lbl_AllSeconds.transform = CGAffineTransformIdentity;
        }completion:^(BOOL finished){
            NSLog(@";Finished...");
        }];
    }];

    //Set NSTimer to Call countdownTracker method to show pending time in Christmas.
    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(countdownTracker:) userInfo:nil repeats:YES];

    //Add font object to Dictionary
    NSDictionary *dictAttributes = [NSDictionary dictionaryWithObject:objFont forKey:NSFontAttributeName];

    //Set dictionary to the titleTextAttributes
    [self.segmentControl setTitleTextAttributes:dictAttributes forState:UIControlStateNormal];
    [self.segmentControl setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor whiteColor]} forState:UIControlStateSelected];

    //Customize UISegmentControl
    [self.segmentControl setBackgroundImage:[UIImage imageNamed:@"NavigatinBackground"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

    //Customize MKMapView to track Santa Location
    geocoder = [[CLGeocoder alloc] init];
    cl_LocationManager = [[CLLocationManager alloc] init];
    cl_LocationManager.delegate = self;
    cl_LocationManager.desiredAccuracy = kCLLocationAccuracyBest;
    //[cl_LocationManager requestWhenInUseAuthorization];
    [cl_LocationManager startUpdatingLocation];

    //Hide UIView's mapView
    self.mapView.hidden = YES;
    self.musicView.hidden = YES;

}

This line causes the crash on iPhone X

 //Add font object to Dictionary
        NSDictionary *dictAttributes = [NSDictionary dictionaryWithObject:objFont forKey:NSFontAttributeName];

Upvotes: 1

Views: 2290

Answers (2)

Larme
Larme

Reputation: 26036

NSDictionary *dictAttributes = [NSDictionary dictionaryWithObject:objFont forKey:NSFontAttributeName];

This line is causing the crash because objFont is nil.

Why? Because that's what you do:

if (somethingA)
{
    objFont = someFont;
}
else if (somethingB)
{
    objFont = someFont;
}
else if (somethingC)
{
    objFont = someFont;
}
//... others else if
else if (somethingN)
{
    objFont = someFont;
}

NSDictionary *dictAttributes = [NSDictionary dictionaryWithObject:objFont forKey:NSFontAttributeName];

What you are missing is that if you never pass an if/else if test, obj font will never be initialized and cause the crash.

else if (somethingN)
{
    objFont = someFont;
}
else 
{
    objFont = someDefaultFont;
}

Or initialize objFont at start when you declare it.

For the rest, your code seems really messy. It could be improved, you shouldn't test like that the height to guess the Model. You can also add the test "else if (height is the one of iPhone X), but that's not ugly) because if tomorrow Apple has a new phone with a new height, your code will crash again for an unmanaged case, so do the "else" or the default init.

Upvotes: 2

Hypergater
Hypergater

Reputation: 649

Inside my code, you can see hard coded font values, such as;

if (height == 568) {
            //Set Font Text Size
            objFont = [UIFont boldSystemFontOfSize:9.0];

            //Set UIScrollView Content Size
            self.srl_ScrollView.frame = CGRectMake(0, self.srl_ScrollView.frame.origin.y, self.view.frame.size.width, 150);
            self.srl_ScrollView.contentSize = CGSizeMake(6*width, 150);

Adding an entry specific to iPhone X size works perfectly;

//iPhoneX
    } else if (height == 812) {
        //Set UIScrollView Content Size
        self.srl_ScrollView.frame = CGRectMake(0, self.srl_ScrollView.frame.origin.y, self.view.frame.size.width, 270);
        self.srl_ScrollView.contentSize = CGSizeMake(6*width, 270);

        objFont = [UIFont boldSystemFontOfSize:11.0];
        [self.img_Top setConstant:100];
    }

Upvotes: 1

Related Questions