Problems adding to NSMutableArray: trying to insert a null object in 10

Hi guys, thatโ€™s why I get these inconsistent errors when starting my program, only about 50% of the time I make these errors and, apparently, different points of my program. Here is the console output:

2011-05-11 14:22:03.926 Parking[20611:1903] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSMutableArray insertObject:atIndex:]: attempt to insert nil object at 10' *** Call stack at first throw: ( 0 CoreFoundation 0x011afbe9 __exceptionPreprocess + 185 1 libobjc.A.dylib 0x013045c2 objc_exception_throw + 47 2 CoreFoundation 0x011a97f1 -[__NSArrayM insertObject:atIndex:] + 225 3 CoreFoundation 0x011a4c44 -[__NSArrayM addObject:] + 68 4 Parking 0x000182fd -[DataLoader loadOverlaysFromStore] + 1521 5 Parking 0x00017b76 -[DataLoader main] + 64 6 Foundation 0x00c5ebd2 -[__NSOperationInternal start] + 747 7 Foundation 0x00c5e826 ____startOperations_block_invoke_2 + 106 8 libSystem.B.dylib 0x9488c024 _dispatch_call_block_and_release + 16 9 libSystem.B.dylib 0x9487e2f2 _dispatch_worker_thread2 + 228 10 libSystem.B.dylib 0x9487dd81 _pthread_wqthread + 390 11 libSystem.B.dylib 0x9487dbc6 start_wqthread + 30 ) terminate called after throwing an instance of 'NSException' 

and

 2011-05-11 14:16:45.171 Parking[20500:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSMutableArray insertObject:atIndex:]: attempt to insert nil object at 2' *** Call stack at first throw: ( 0 CoreFoundation 0x011afbe9 __exceptionPreprocess + 185 1 libobjc.A.dylib 0x013045c2 objc_exception_throw + 47 2 CoreFoundation 0x011a97f1 -[__NSArrayM insertObject:atIndex:] + 225 3 CoreFoundation 0x011a4c44 -[__NSArrayM addObject:] + 68 4 Parking 0x00012887 -[CoreDataSingleton getParkingLotTitlesForPermits:] + 1030 5 Parking 0x00004891 -[ParkingMapViewController sortLotsIntoSetsAccordingToPermitsAccepted] + 616 6 Parking 0x00006317 -[ParkingMapViewController viewDidLoad] + 1474 7 UIKit 0x000fc65e -[UIViewController view] + 179 8 UIKit 0x000faa57 -[UIViewController contentScrollView] + 42 9 UIKit 0x0010b201 -[UINavigationController _computeAndApplyScrollContentInsetDeltaForViewController:] + 48 10 UIKit 0x00109831 -[UINavigationController _layoutViewController:] + 43 11 UIKit 0x0010ab4c -[UINavigationController _startTransition:fromViewController:toViewController:] + 524 12 UIKit 0x00105606 -[UINavigationController _startDeferredTransitionIfNeeded] + 266 13 UIKit 0x0021de01 -[UILayoutContainerView layoutSubviews] + 226 14 QuartzCore 0x01a15451 -[CALayer layoutSublayers] + 181 15 QuartzCore 0x01a1517c CALayerLayoutIfNeeded + 220 16 QuartzCore 0x01a15088 -[CALayer layoutIfNeeded] + 111 17 UIKit 0x000fdb5f -[UIViewController window:willAnimateRotationToInterfaceOrientation:duration:] + 587 18 UIKit 0x000768e9 -[UIWindow _setRotatableClient:toOrientation:updateStatusBar:duration:force:] + 4347 19 UIKit 0x002f5948 -[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:] + 1053 20 UIKit 0x00100982 -[UIViewController presentModalViewController:withTransition:] + 3151 21 Parking 0x0000b104 -[SampleHomeScreen appButtonTapped:] + 124 22 UIKit 0x0004ea6e -[UIApplication sendAction:to:from:forEvent:] + 119 23 UIKit 0x000dd1b5 -[UIControl sendAction:to:forEvent:] + 67 24 UIKit 0x000df647 -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 527 25 UIKit 0x000de1f4 -[UIControl touchesEnded:withEvent:] + 458 26 UIKit 0x000730d1 -[UIWindow _sendTouchesForEvent:] + 567 27 UIKit 0x0005437a -[UIApplication sendEvent:] + 447 28 UIKit 0x00059732 _UIApplicationHandleEvent + 7576 29 GraphicsServices 0x01424a36 PurpleEventCallback + 1550 30 CoreFoundation 0x01191064 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52 31 CoreFoundation 0x010f16f7 __CFRunLoopDoSource1 + 215 32 CoreFoundation 0x010ee983 __CFRunLoopRun + 979 33 CoreFoundation 0x010ee240 CFRunLoopRunSpecific + 208 34 CoreFoundation 0x010ee161 CFRunLoopRunInMode + 97 35 GraphicsServices 0x01423268 GSEventRunModal + 217 36 GraphicsServices 0x0142332d GSEventRun + 115 37 UIKit 0x0005d42e UIApplicationMain + 1160 38 Parking 0x00002424 main + 102 39 Parking 0x000023b5 start + 53 ) terminate called after throwing an instance of 'NSException' 

I missed it with the debugger and couldnโ€™t determine at what point in my program it fails, however I have a suspicion that it may be in this new section of the code that I wrote (threw it into the extra one saved here and there to help this error - will deal with the release later):

 -(id)initWithFunction:(LoaderFunc)func withDelegate:(id)delegate setRestricted:(NSSet *)restricted setA:(NSSet *)A setC:(NSSet *)C setL:(NSSet *)L { if (self = [super init]) { self.addedOverlays = [[NSMutableArray alloc] init]; self.addedAnnotations = [[NSMutableArray alloc] init]; self.overlayRegions = [[NSMutableArray alloc] init]; self.loaderFunc = func; self.DLDelegate = delegate; return self; } return nil; } //... -(void)loadOverlaysFromStore { NSLog(@"DataLoader.m loadOverlaysFromStore"); //NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSDictionary *permits; permits = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"0",@"0",@"0",nil] forKeys:[NSArray arrayWithObjects:@"A",@"C",@"L",nil]]; NSSet *setOfRestrictedLots = [[NSSet setWithArray:[[CoreDataSingleton sharedManager] getParkingLotsForPermits:permits]] retain]; NSMutableArray *arrayOfRestrictedLotTitles = [[NSMutableArray alloc] init]; for (ParkingLot *l in [setOfRestrictedLots allObjects]) { [arrayOfRestrictedLotTitles addObject:[[l lotName]retain]]; } permits = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"1",@"0",@"0",nil] forKeys:[NSArray arrayWithObjects:@"A",@"C",@"L",nil]]; NSSet *setOfALots = [[NSSet setWithArray:[[CoreDataSingleton sharedManager] getParkingLotsForPermits:permits]] retain]; NSMutableArray *arrayOfALotTitles = [[NSMutableArray alloc] init]; for (ParkingLot *l in [setOfALots allObjects]) { [arrayOfALotTitles addObject:[[l lotName]retain]]; } permits = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"1",@"1",@"0",nil] forKeys:[NSArray arrayWithObjects:@"A",@"C",@"L",nil]]; NSSet *setOfCLots = [[NSSet setWithArray:[[CoreDataSingleton sharedManager] getParkingLotsForPermits:permits]] retain]; NSMutableArray *arrayOfCLotTitles = [[NSMutableArray alloc] init]; for (ParkingLot *l in [setOfCLots allObjects]) { [arrayOfCLotTitles addObject:[[l lotName]retain]]; } permits = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"1",@"1",@"1",nil] forKeys:[NSArray arrayWithObjects:@"A",@"C",@"L",nil]]; NSSet *setOfLLots = [[NSSet setWithArray:[[CoreDataSingleton sharedManager] getParkingLotsForPermits:permits]] retain]; NSMutableArray *arrayOfLLotTitles = [[NSMutableArray alloc] init]; for (ParkingLot *l in [setOfLLots allObjects]) { [arrayOfLLotTitles addObject:[[l lotName]retain]]; } [addedOverlays addObject:setOfRestrictedLots]; [addedOverlays addObject:setOfALots]; [addedOverlays addObject:setOfCLots]; [addedOverlays addObject:setOfLLots]; for (NSSet* set in addedOverlays) { for (ParkingLot *lot in [set allObjects]) { ParkingRegionOverlay *regionPolygon = [[ParkingRegionOverlay alloc] initWithPoints:[lot overlayCoordPoints] andTitle:[lot lotName] setRestricted:[NSSet setWithArray:arrayOfRestrictedLotTitles] setA:[NSSet setWithArray:arrayOfALotTitles] setC:[NSSet setWithArray:arrayOfCLotTitles] setL:[NSSet setWithArray:arrayOfLLotTitles]]; [overlayRegions addObject:regionPolygon]; [regionPolygon release]; } } }//loadOverlays 

Any help is greatly appreciated. Thanks!

+1
source share
2 answers

So, I figured it out. Remember how I said that this happened in about 50% of cases? This was a HUGE hint since I had code that retrieved data from my main data store, which was accessed in two ways. I changed my code to get a background thread to access this method, but forgot to remove the call from it from the part of the code where the main thread works. Thus, there would be race conditions in data access, and I'm not too sure why this would result in a null value in some cases, but removing the call to this function from the main thread fixes the problem.

+3
source

So, the debugging message is pretty clear: at some point you are trying to insert an object that does not exist in your array.

Since based on the magazines you published, this apparently happens in several places in your application, the best strategy is to make it impossible to insert the nil value in your arrays in the first place.

I would recommend that you: a) establish what causes these nil values โ€‹โ€‹to appear (presumably bad input), and b) if you cannot get your input to behave properly, protect your application to take that into account.

Honestly, it's probably a good idea to verify that you are still not trying to insert an nil value object. You can either use the try / catch statement to catch the exception when this happens, or check the object before inserting it:

 if ([l lotname]) { [arrayOfALotTitles addObject:[[l lotName]retain]]; } 

(PS: not sure why you explicitly save when you add to the array. Usually you do not need to do this. I hope you agree with it with the corresponding release!).

+2
source

Source: https://habr.com/ru/post/958363/


All Articles