I had a case where an app ran fine in the simulator but crashed unceremoniously on the device. After much head scratching I found that a coding error that seemed not to bother the simulator was the culprit. This is what the code looked like:
tile.frame = [[location objectAtIndex:i] CGPointValue];
Looks innocent, right? However, "location" is an NSMutableArray and, in this particular case, I was stuffing CGRect values into it, not CGPoint! For some reason this worked fine on the simulator. The app ran exactly as expected. However, as I mentioned, the device did not like it. After editing the above line of code to:
tile.frame = [[location objectAtIndex:i] CGRectValue];
...everyone was happy.
What happened was that I was originally using CGPoint values in that array but later changed my approach and switched to CGRect. As I made the changes I missed one line. The simulator did not throw up at this, which still surprises me.
If you recently made changes comb through the code and see if you forgot to update something like this. Also, if you are using version control, roll back until you find a version that worked. That's how I discovered it. Then pepper your code with NSLog statements (or use breakpoints) to find out where it is crashing. Hopefully it will be obvious once you get close to the area causing the crash.