My application was working fine on iOS6 but it is crashing on iOS 7 due to bad access when I add overlay to MKMapView.My code is as follows
MKPolyline *polyline = [[MKPolyline alloc] init];
polyline = [MKPolyline polylineWithCoordinates:coordinates count:numberOfSteps];
[directionMap addOverlay:polyline];
This is the crash log
(lldb) bt
*
thread #51: tid = 0x1cc5, 0x38755f8c libdispatch.dylib`dispatch_retain$VARIANT$mp + 8, stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
frame #0: 0x38755f8c libdispatch.dylib`dispatch_retain$VARIANT$mp + 8
frame #1: 0x3598dbc8 VectorKit`-[VKRasterOverlayTileSource init] + 176
frame #2: 0x358cfd24 VectorKit`-[VKMapModel _rasterOverlayTileSourceForLevel:] + 308
frame #3: 0x358d0226 VectorKit`-[VKMapModel addRasterOverlay:] + 46
frame #4: 0x2f068dfe MapKit`-[MKOverlayContainerView _insertDrawable:forOverlay:atIndex:level:] + 1010
frame #5: 0x2f06752e MapKit`-[MKOverlayContainerView _configureAndAddDrawable:forOverlay:level:] + 326
frame #6: 0x2f0676ac MapKit`-[MKOverlayContainerView _considerAddingDrawable:inAddRect:level:] + 372
frame #7: 0x2f067cce MapKit`-[MKOverlayContainerView addOverlay:level:] + 246
frame #8: 0x001394c8 Falcon`-[GetDirectionVC showRouteFrom:to:](self=0x19742820, _cmd=0x001fa466, f=CLLocationCoordinate2D at 0x04f9ec2c, t=CLLocationCoordinate2D at 0x04f9ec1c) + 956 at GetDirectionVC.m:226
frame #9: 0x001390ee Falcon`-[GetDirectionVC loadLocations](self=0x19742820, _cmd=0x001fa458) + 1314 at GetDirectionVC.m:173
frame #10: 0x2e876e26 Foundation`__NSThread__main__ + 1062
frame #11: 0x38891c1c libsystem_pthread.dylib`_pthread_body + 140
frame #12: 0x38891b8e libsystem_pthread.dylib`_pthread_start + 102
(lldb)
I had the same problem, the stack trace looks misleading to me. My bugfix is to explicitely add the overlay on the main thread:
dispatch_async(dispatch_get_main_queue(), ^{
[mapView addOverlay:myRouteLine];
});
or if you'd like to use the new MKOverlayRenderer:
dispatch_async(dispatch_get_main_queue(), ^{
[mapView addOverlay:myRouteLine level:MKOverlayLevelAboveRoads];
});
In my case, I'm downloading asynchronously some data, generate Polylines, create MKOverlayViews / MKOverlayRenderes (didn't help to replace the deprecated code) and add the overlay to the map.
Use following If you are creating poly lines in thread other than main thread:
[self performSelectorOnMainThread:#selector(addPolyLineToMap:) withObject:polyline waitUntilDone:NO];
-(void)addPolyLineToMap:(MKPolyline*)apolyline{
[mapview addOverlay:apolyline];
}
Related
I have created a custom UIView which is instantiated 3 times from UIViewController. From the viewDidLoad method of that UIViewController:
self.remainingDays = [[RemainingTileView alloc] initWithFrame:CGRectMake(20, 49, 80, 75)];
self.remainingHours = [[RemainingTileView alloc] initWithFrame:CGRectMake(120, 49, 80, 75)];
self.remainingMinutes = [[RemainingTileView alloc] initWithFrame:CGRectMake(220, 49, 80, 75)];
[self.view addSubview:self.remainingDays];
[self.view addSubview:self.remainingHours];
[self.view addSubview:self.remainingMinutes];
In the RemainingTileView class, I have this layoutSubviews method:
- (void)layoutSubviews {
[super layoutSubviews];
if (self.number) // This is an NSNumber property
self.numberLabel = [self labelForNumber:[self.number intValue]];
else
self.numberLabel = [self labelForNumber:0];
if (self.unit) // This is an NSString property
self.unitLabel = [self labelForUnit:self.unit];
else
self.unitLabel = [self labelForUnit:#""];
[self configView];
}
When creating the view, it crashes on the line if (self.number) with the stack frame:
* thread #1: tid = 0x2403, 0x39f6c526 libobjc.A.dylib`objc_retain + 6, stop reason = EXC_BAD_ACCESS (code=1, address=0x10000010)
frame #0: 0x39f6c526 libobjc.A.dylib`objc_retain + 6
frame #1: 0x000dc742 myProject`-[RemainingTileView layoutSubviews](self=0x1e892b80, _cmd=0x344cde51) + 106 at RemainingTileView.m:63
frame #2: 0x3405d802 UIKit`-[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 258
frame #3: 0x33e07d8a QuartzCore`-[CALayer layoutSublayers] + 214
frame #4: 0x33e07928 QuartzCore`CA::Layer::layout_if_needed(CA::Transaction*) + 460
frame #5: 0x33e0885c QuartzCore`CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 16
frame #6: 0x33e08242 QuartzCore`CA::Context::commit_transaction(CA::Transaction*) + 238
frame #7: 0x33e08050 QuartzCore`CA::Transaction::commit() + 316
frame #8: 0x33e07eb0 QuartzCore`CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 60
frame #9: 0x322276cc CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 20
frame #10: 0x322259c0 CoreFoundation`__CFRunLoopDoObservers + 276
frame #11: 0x32225d16 CoreFoundation`__CFRunLoopRun + 742
frame #12: 0x32198ebc CoreFoundation`CFRunLoopRunSpecific + 356
frame #13: 0x32198d48 CoreFoundation`CFRunLoopRunInMode + 104
frame #14: 0x35d6f2ea GraphicsServices`GSEventRunModal + 74
frame #15: 0x340ae300 UIKit`UIApplicationMain + 1120
frame #16: 0x000d3448 Project Countdown`main(argc=1, argv=0x2fd2ecf8) + 116 at main.m:17
self.number is an instance of NSNumber.
The UI is being modified from the main thread. I have looked for existings solutions here on stackoverflow but nothing worked.
What am I missing? What should I look for?
Looks like your properties have incorrect declarations. Probably assign or weak instead of retain, copy, or strong.
It looks like the property is returning some invalid object and ARC is attempting to retain it, which then fails. It looks like you might be better off moving your check for nil values into a custom property accessor, something along the lines of:
- (NSNumber *)number {
if (_number == nil) {
_number = [NSNumber numberWithInt:0];
}
return _number;
}
Then you can simply set the numberLabel value to number without having to check here. You can do something similar for unit as well.
I am getting the following warning with Device only:
CoreAnimation: warning, deleted thread with uncommitted CATransaction; created by:
0 QuartzCore 0x3763c65d <redacted> + 220
1 QuartzCore 0x3763c541 <redacted> + 224
2 QuartzCore 0x3763fe2f <redacted> + 30
3 QuartzCore 0x3763b9bf <redacted> + 318
4 QuartzCore 0x3763b87b <redacted> + 50
5 QuartzCore 0x3763b80b <redacted> + 538
6 MyApp 0x000df597 -[CommonClass orangeGradient:] + 382
7 MyApp 0x000f70e1 -[HomeViewController updateStatusBar] + 1700
8 MyApp 0x000f61bd -[HomeViewController statusRecieved] + 224
9 MyApp 0x000cd323 -[CommonClass statusReceivedFromServer] + 142
10 MyApp 0x000d833d -[CommonClass accountStatus] + 7416
11 Foundation 0x35a3767d <redacted> + 972
12 libsystem_c.dylib 0x35c9a311 <redacted> + 308
13 libsystem_c.dylib 0x35c9a1d8 thread_start + 8
My Method that is on top of the stack is as follows:
- (void)orangeGradient: (UILabel *)fillLabel {
#synchronized([CommonClass class]) {
CAGradientLayer * gradientLayer = [CAGradientLayer layer];
gradientLayer.frame = fillLabel.bounds;
gradientLayer.colors = [NSArray arrayWithObjects:(id)[UIColorFromRGB(0xfbb250) CGColor],(id)[UIColorFromRGB(0xf47c2a) CGColor], nil];
[fillLabel.layer addSublayer:gradientLayer];
}
}
Any idea on why is this coming, and how I can fix this?
It looks like orangeGradient: is called from a background thread. Core Animation groups all changes into CATransactions. Usually this is done automatically from the run loop. On background threads there is (usually) no run loop, so you have to create the transaction yourself:
- (void)orangeGradient: (UILabel *)fillLabel {
#synchronized([CommonClass class]) {
[CATransaction begin];
CAGradientLayer * gradientLayer = [CAGradientLayer layer];
gradientLayer.frame = fillLabel.bounds;
gradientLayer.colors = [NSArray arrayWithObjects:(id)[UIColorFromRGB(0xfbb250) CGColor],(id)[UIColorFromRGB(0xf47c2a) CGColor], nil];
[fillLabel.layer addSublayer:gradientLayer];
[CATransaction commit];
}
}
There's another issue: UIKit is not thread safe. You can't call bounds on a UILabel on a background thread.
Check anywhere in your code there is an uncommitted CATransaction. You will need to perform this operation following way;
[CATransaction begin];
[CATransaction setDisableActions:YES];
[commonClassObject orangeGradient:lblFill];
[CATransaction commit];
[EDIT]
Basically this problem happens when NSOperation completes before CoreAnimation is done performing. There must be some relation between these two class in somewhere in your code you need to figure that out.
I'll just add that I had the same problem with initWithFrame from a background threads.
Seems that since iOS 7 and upwards, some calls to UIKit must be done under the main thread, and cannot be called from a background thread.
Also note that after several warnings like this, my app stopped responding completely. So better not ignore such warning.
Okay this is the first place in my app I'm using a block for anything so is there some setup or Xcode setting I need to check? This seems to me a simple use of blocks, not doing anything fancy but it crashes out on: tweetViewController.completionHandler = ^(TWTweetComposeViewControllerResult result) in the iOS 6 simulator.
- (void) showTweetComposer
{
TWTweetComposeViewController *tweetViewController = [[TWTweetComposeViewController alloc] init];
[self presentViewController:tweetViewController animated:YES completion:nil];
tweetViewController.completionHandler = ^(TWTweetComposeViewControllerResult result)
{
[self dismissModalViewControllerAnimated:YES];
};
[tweetViewController release];
}
thread #1: tid = 0x1c03, 0x02e3d09f libobjc.A.dylib`objc_msgSend + 19, stop reason = EXC_BAD_ACCESS (code=2, address=0x0)
frame #0: 0x02e3d09f libobjc.A.dylib`objc_msgSend + 19
frame #1: 0x02e28cc9 libobjc.A.dylib`objc_setProperty_nonatomic_copy + 49
frame #2: 0x051c38b2 Social`-[SLTwitterComposeViewController setCompletionHandler:] + 47
frame #3: 0x001e2e06 MyApp`-[SocialViewController showTweetComposer] + 246 at SocialViewController.m:137
frame #4: 0x001e2ff7 MyApp`-[SocialViewController tweetToFriendsRowTouched] + 247 at SocialViewController.m:150
frame #5: 0x02e3f663 libobjc.A.dylib`-[NSObject performSelector:] + 62
frame #6: 0x0018b4f1 MyApp`-[GroupedTableViewController tableView:didSelectRowAtIndexPath:] + 401 at GroupedTableViewController.m:143
This happens whether I'm logged into twitter or not.
EDIT: I added a simple block based code snippet to the beginning for my showTweetComposer method to test that any kind of blocks are working in my code:
[UIView animateWithDuration:0.2 animations:^{
self.view.alpha = 0.0;
} completion:^(BOOL finished){
[self.view removeFromSuperview];
}];
Now it is crashing on this new block. So, it would seem there's something in my project that needs to be set to support using blocks but I'm not sure what that would be. My iOS deployment target is set to iOS 4.3.
Okay, solved. This gist is, don't weak-link against libSystem.dylib using -weak_library
Found the answer here
I'm trying to test a Cocos2D app on an iPhone, and get this crash that I copied from the console:
cocos2d: CCSpriteFrameCache: Trying to use file 'heroTestSheet.png' as texture
cocos2d: CCTexture2D. Can't create Texture. UIImage is nil
cocos2d: Couldn't add image:heroTestSheet.png in CCTextureCache
cocos2d: CCSpriteFrameCache: Couldn't load texture
cocos2d: CCTexture2D. Can't create Texture. UIImage is nil
cocos2d: Couldn't add image:heroTestSheet.png in CCTextureCache
cocos2d: CCSpriteFrameCache: Frame 'heroFrame1.png' not found
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSMutableArray insertObject:atIndex:]: attempt to insert nil object at 0'
*** Call stack at first throw:
(
0 CoreFoundation 0x3759dc7b __exceptionPreprocess + 114
1 libobjc.A.dylib 0x32d9bee8 objc_exception_throw + 40
2 CoreFoundation 0x3752a951 -[__NSArrayM insertObject:atIndex:] + 136
3 CoreFoundation 0x3752a8bf -[__NSArrayM addObject:] + 34
4 cocosTests 0x0000ce28 -[HeroClass init] + 1544
5 cocosTests 0x0000304c -[DebugZoneLayer init] + 860
6 cocosTests 0x00074e04 +[CCNode node] + 76
7 cocosTests 0x0000c4e4 -[DebugZoneScene init] + 244
8 cocosTests 0x00074e04 +[CCNode node] + 76
9 cocosTests 0x0000c390 +[DebugZoneScene scene] + 100
10 cocosTests 0x00002540 -[cocosTestsAppDelegate applicationDidFinishLaunching:] + 1028
11 UIKit 0x3592502c -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1200
12 UIKit 0x3591ea78 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 396
13 UIKit 0x358d82e4 -[UIApplication handleEvent:withNewEvent:] + 1476
14 UIKit 0x358d7b1c -[UIApplication sendEvent:] + 68
15 UIKit 0x358d73b4 _UIApplicationHandleEvent + 6824
16 GraphicsServices 0x33e77c88 PurpleEventCallback + 1048
17 CoreFoundation 0x3752f5cb __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 28
18 CoreFoundation 0x3752f589 __CFRunLoopDoSource1 + 164
19 CoreFoundation 0x37521835 __CFRunLoopRun + 580
20 CoreFoundation 0x3752150b CFRunLoopRunSpecific + 226
21 CoreFoundation 0x37521419 CFRunLoopRunInMode + 60
22 UIKit 0x3591d554 -[UIApplication _run] + 548
23 UIKit 0x3591a558 UIApplicationMain + 972
24 cocosTests 0x000020c4 main + 100
25 cocosTests 0x0000205c start + 40
)
terminate called after throwing an instance of 'NSException'
Program received signal: “SIGABRT”.
warning: Unable to read symbols for /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.2.1 (8C148)/Symbols/Developer/usr/lib/libXcodeDebuggerSupport.dylib (file not found).
Running it in the simulator runs fine, but I still get this message in the console when it starts up "CCSpriteFrameCache: Trying to use file 'heroTestSheet.png' as texture"
I suspect that's where the problem starts. Maybe I'm just understanding how my code for my hero sprite subclass should be written. I thought heroTestSheet.png was the texture it was relying on to split up into other images referencing the plist.
Here's my init in my hero subclass:
-(id) init{
self = [super init];
if (!self) {
return nil;
}
_collisWidthFromCtr = 16;
_collisHeightFromCtr = 16;
_collisPushPointsNums = 5;
_travelRectCenterPoints = [[NSMutableArray alloc] init];
_collisPushPoints = [[NSMutableArray alloc] init];
[_collisPushPoints insertObject:[NSValue valueWithCGPoint:CGPointMake( _collisWidthFromCtr, _collisHeightFromCtr)] atIndex:0];
[_collisPushPoints insertObject:[NSValue valueWithCGPoint:CGPointMake( _collisWidthFromCtr, 0)] atIndex:1];
[_collisPushPoints insertObject:[NSValue valueWithCGPoint:CGPointMake( _collisWidthFromCtr,-_collisHeightFromCtr)] atIndex:2];
[_collisPushPoints insertObject:[NSValue valueWithCGPoint:CGPointMake( 0, _collisHeightFromCtr)] atIndex:3];
[_collisPushPoints insertObject:[NSValue valueWithCGPoint:CGPointMake(-_collisWidthFromCtr, _collisHeightFromCtr)] atIndex:4];
_rectCheckRes = 32;
_speed = 8;
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:#"heroTestSheet.plist"];
_heroSpriteSheet = [CCSpriteBatchNode batchNodeWithFile:#"heroTestSheet.png"];
//[self addChild:_heroSpriteSheet];
NSMutableArray *heroSpriteFlyAnimFrames = [NSMutableArray array];
for(int i = 1; i <= 2; ++i) {
[heroSpriteFlyAnimFrames addObject:
[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
[NSString stringWithFormat:#"heroFrame%d.png", i]]];
}
CCAnimation *heroSpriteFlyAnim = [CCAnimation animationWithFrames:heroSpriteFlyAnimFrames delay:0.03f];
_heroSprite = [CCSprite spriteWithSpriteFrameName:#"heroFrame1.png"];
_heroSpriteFlyAction = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:heroSpriteFlyAnim restoreOriginalFrame:NO]];
[_heroSprite runAction:_heroSpriteFlyAction];
[_heroSpriteSheet addChild:_heroSprite];
return self;
}
Please excuse me if I'm being unclear, so let me know any other info I need to provide. Just posting this for now because I don't know where else to start to solve it and what other info I should provide, and it might be obvious to some other cocos devs whats wrong from what I posted. Thanks
The simulator can be more forgiving than the device. Double check that your file name really is "heroTestSheet.png" and not "HeroTestSheet.png" for example. It is case sensitive on your device.
Figured it out.. it was just the heroTestSheet.png it was trying to use was somehow invalid. I exported in an older photoshop, but I'm not really positive what settings it had. I exported it again from a newer photoshop without any color mange settings, and now it works fine!
I think you image was not added on the project.
You must copy your binary to the resource.
select your target and then select the build phases then copy bundle resource
add you image on that content.
I think it will work.
I received the first crash report but I am not able to get what is the problem.
Fortunately, since this crash came from a colleague of mine, I can test the error directly on his iPhone and install a development version on his phone.
However, the strange thing is that when I install and run the development version on his device from my computer there is no crash; the crash appear only when the application is downloaded and installed from the App Store.
Until now I could not reproduce the error on any other device (the affected device is an iPhone 3G firmware 4.2.1 and all the operating system run very slowly).
The crash happen after that a row is selected from a UITableViewController (ItemsListTableViewController), at this point a detail view should appear, but the application crash during the construction of the detail view (ItemDetailViewController) in viewDidLoad.
In particular the problem seem to be localized within the class LocationPathView (a subview of ItemDetailViewController's view).
ItemDetailViewController is a subclass of UITableViewController and load its tableHeaderView from nib in viewDidLoad with:
[[NSBundle mainBundle] loadNibNamed:#"ItemDetailHeaderView" owner:self options:nil];
(LocationPathView is part of the tableHeaderView)
When the nib file is loaded, LocationPathView::awakeFromNib is called and then LocationPathView::layoutSubviews is called. The crash seem to be originated from layoutSubviews.
Within layoutSubviews I perform an animation:
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.2];
Could this animation create for some reasons the crash on slow device? Is correct to animate within layoutSubviews?
I would be grateful for any help,
Marco
Date/Time: 2011-04-30 12:50:36.972 +0200
OS Version: iPhone OS 4.2.1 (8C148)
Report Version: 104
Exception Type: EXC_CRASH (SIGABRT)
Exception Codes: 0x00000000, 0x00000000
Crashed Thread: 0
Thread 0 Crashed:
0 libSystem.B.dylib 0x35de3ad0 __kill + 8
1 libSystem.B.dylib 0x35de3abe kill + 4
2 libSystem.B.dylib 0x35de3ab2 raise + 10
3 libSystem.B.dylib 0x35dfad5e abort + 54
4 libstdc++.6.dylib 0x374f2a00 __gnu_cxx::__verbose_terminate_handler() + 588
5 libobjc.A.dylib 0x32d9d8d8 _objc_terminate + 160
6 libstdc++.6.dylib 0x374f0100 __cxxabiv1::__terminate(void (*)()) + 76
7 libstdc++.6.dylib 0x374f0178 std::terminate() + 16
8 libstdc++.6.dylib 0x374f02a0 __cxa_throw + 100
9 libobjc.A.dylib 0x32d9bf28 objc_exception_throw + 104
10 CoreFoundation 0x3759dabc +[NSException raise:format:arguments:] + 64
11 CoreFoundation 0x3759daf0 +[NSException raise:format:] + 24
12 QuartzCore 0x33d9409c CALayerSetPosition(CALayer*, CA::Vec2<double> const&, bool) + 180
13 QuartzCore 0x33d93fd8 -[CALayer setPosition:] + 40
14 QuartzCore 0x33d93efc -[CALayer setFrame:] + 444
15 UIKit 0x358d92c8 -[UIView(Geometry) setFrame:] + 248
16 UIKit 0x3592dde0 -[UIButton setFrame:] + 120
17 MyApp 0x0003432a -[LocationPathView layoutSubviews] (LocationPathView.m:101) <<<<<<<<<<<<<<<<<<<<<<<<<<<
18 UIKit 0x358ec704 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 32
19 CoreFoundation 0x37538f72 -[NSObject(NSObject) performSelector:withObject:] + 18
20 QuartzCore 0x33d9a128 -[CALayer layoutSublayers] + 176
21 QuartzCore 0x33d99db0 CALayerLayoutIfNeeded + 192
22 QuartzCore 0x33d99cd8 -[CALayer layoutIfNeeded] + 108
23 UIKit 0x3598ee38 -[UIView(Hierarchy) layoutIfNeeded] + 24
24 UIKit 0x359fbabc -[UIButton titleLabel] + 76
25 MyApp 0x0001fee8 -[ItemDetailViewController viewDidLoad] (ItemDetailViewController.m:148) <<<<<<<<<<<<<<<<<<<<<<<<<<<
26 UIKit 0x35926e58 -[UIViewController view] + 152
27 UIKit 0x35937f2c -[UIViewController contentScrollView] + 24
28 UIKit 0x35937d4c -[UINavigationController _computeAndApplyScrollContentInsetDeltaForViewController:] + 36
29 UIKit 0x35937bf8 -[UINavigationController _layoutViewController:] + 28
30 UIKit 0x35937474 -[UINavigationController _startTransition:fromViewController:toViewController:] + 336
31 UIKit 0x35937288 -[UINavigationController _startDeferredTransitionIfNeeded] + 256
32 UIKit 0x35926c44 -[UINavigationController pushViewController:transition:forceImmediate:] + 904
33 UIKit 0x359268a8 -[UINavigationController pushViewController:animated:] + 36
34 MyApp 0x00020a9a -[ItemsListTableViewController viewItemDetail:startEditable:] (ItemsListTableViewController.m:717)
35 MyApp 0x00022110 -[ItemsListTableViewController tableView:didSelectRowAtIndexPath:] (ItemsListTableViewController.m:241) <<<<<<<<<<<<<<<<<<<<<<<<<<<
36 UIKit 0x3595bf4c -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 884
37 UIKit 0x35a5da9c -[UITableView _userSelectRowAtPendingSelectionIndexPath:] + 196
38 Foundation 0x351724d4 __NSFireDelayedPerform + 360
39 CoreFoundation 0x375522fe __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 10
40 CoreFoundation 0x37551cd2 __CFRunLoopDoTimer + 982
41 CoreFoundation 0x37521a8a __CFRunLoopRun + 1178
42 CoreFoundation 0x37521504 CFRunLoopRunSpecific + 220
43 CoreFoundation 0x37521412 CFRunLoopRunInMode + 54
44 GraphicsServices 0x33e76d1c GSEventRunModal + 188
45 UIKit 0x3591d574 -[UIApplication _run] + 580
46 UIKit 0x3591a550 UIApplicationMain + 964
47 MyApp 0x00002fce main (main.m:14)
48 MyApp 0x00002f98 0x1000 + 8088
ItemsListTableViewController.m:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
Item *item = [self.fetchedResultsController objectAtIndexPath:indexPath];
[self viewItemDetail:item startEditable:NO]; <<<<<<<<<<<<<<<<<<<
}
- (void)viewItemDetail:(Item *)item startEditable:(BOOL)editable {
ItemDetailViewController *controller = [[ItemDetailViewController alloc] initWithStyle:UITableViewStyleGrouped showItem:item inItemsList:[self.fetchedResultsController fetchedObjects]];
if (editable)
controller.editing = YES;
[self.navigationController pushViewController:controller animated:YES]; <<<<<<<<<<<<<<<<<<<
[controller release];
}
ItemDetailViewController.m:
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationItem.title = NSLocalizedString(#"Item details", #"Item details");
self.navigationItem.rightBarButtonItem = self.editButtonItem;
self.view.backgroundColor = [UIColor groupTableViewBackgroundColor];
// Configure the tableview
self.tableView.sectionFooterHeight = 5.0f;
self.tableView.allowsSelectionDuringEditing = YES;
// Create and set the tableview header
if (headerView == nil) {
[[NSBundle mainBundle] loadNibNamed:#"ItemDetailHeaderView" owner:self options:nil]; <<<<<<<<<<<<<<<<<<<<<<<<<<<
// Item title button
itemTitleButton.titleLabel.adjustsFontSizeToFitWidth = YES;
itemTitleButton.titleLabel.minimumFontSize = 11.0f;
[itemTitleButton setImageEdgeInsets:UIEdgeInsetsMake(0.0f, itemTitleButton.bounds.size.width-29.0f, 0.0f, 0.0f)];
[itemTitleButton setTitleEdgeInsets:UIEdgeInsetsMake(0.0f, 0.0f, 0.0f, 24.0f)];
UIImage *normalImage = [[UIImage imageNamed:#"objectNameHighlighedButton.png"] stretchableImageWithLeftCapWidth:11 topCapHeight:0];
[self.itemTitleButton setBackgroundImage:normalImage forState:UIControlStateHighlighted];
[pathView addTarget:self action:#selector(moveButtonTouchUp:) forControlEvents:UILocationPathViewMoveControlEvent];
// Check if the item's path should be recalculated
if (pathView.pathList == nil) {
pathView.pathList = pathNames;
}
self.tableView.tableHeaderView = headerView;
// Save initial header height so that it can be restore navigating between items with different flags count
tableHeaderFrameHeight = headerView.frame.size.height;
}
// Enable the UIToolbar at the bottom of the view controller and create its buttons
[self.navigationController setToolbarHidden:NO animated:YES];
self.navigationController.toolbar.barStyle = UIBarStyleBlack;
self.navigationController.toolbar.translucent = YES;
// [omitted part]: create toolbar items …
// Restore editing status if the view was unloaded
if (viewUnloaded && self.editing) {
viewUnloaded = NO;
// this will force setEditing:YES to be called on all tableView's subviews! (categorySectionHeaderView...)
[self.tableView setEditing:YES];
// ...not for tableheader!
editableImageView.editing = YES;
pathView.editing = YES;
}
// Recreate item flags
CGRect headerFrame = headerView.frame;
for (FlaggedItem *flagObject in self.itemBookmarkRibbons) {
headerFrame.size.height += ITEM_SHEET_FLAG_BUTTON_HEIGHT + 8.0f;
headerView.frame = headerFrame;
UIButton *bookmarkRibbon = [self createBookmarkRibbon:flagObject];
bookmarkRibbon.frame = CGRectMake(0.0f, headerFrame.size.height-ITEM_SHEET_FLAG_BUTTON_HEIGHT-8.0f,
headerFrame.size.width, ITEM_SHEET_FLAG_BUTTON_HEIGHT);
[headerView addSubview:bookmarkRibbon];
[headerView sendSubviewToBack:bookmarkRibbon];
}
// Update the table header view height
self.tableView.tableHeaderView = headerView;
}
LocationPathView.m:
- (void)awakeFromNib {
[super awakeFromNib];
UIColor *color = [[UIColor alloc] initWithWhite:0.0f alpha:0.0f];
self.backgroundColor = color;
[color release];
[self sendSubviewToBack:backgroundView];
// create imageview rounded rect
CALayer *l = [backgroundView layer];
[l setMasksToBounds:YES];
[l setCornerRadius:10.0];
[l setBorderWidth:2.0];
UIColor *borderColor = [[UIColor alloc] initWithWhite:0.65 alpha:1.0];
[l setBorderColor:[borderColor CGColor]];
[borderColor release];
expanded = NO;
buttons = [[NSMutableArray alloc] initWithCapacity:2];
[buttons addObject:[self createButtonOfType:PVButtonTypeStart]];
[buttons addObject:[self createButtonOfType:PVButtonTypeEnd]];
}
- (void)layoutSubviews {
#define MOVE_BUTTON_WIDTH 90.0f
#define STANDARD_BUTTON_HEIGHT 22.0f
[super layoutSubviews];
CGRect contentRect = self.frame;
if (CGRectIsEmpty(contentRect))
return;
if ([buttons count] != [pathList count] && [pathList count] > 0) {
[self prepareButtons];
}
[UIView beginAnimations:nil context:nil]; <<<<<<<<<<<<<<<<<<<
[UIView setAnimationDuration:0.2];
CGFloat x = 0.0f, y = 0.0f;
CGFloat availableHSpace = 0.0f;
UIButton *button;
for (NSUInteger i=0; i<[self.buttons count]; i++) {
button = [buttons objectAtIndex:i];
if (self.isExpanded == NO && i > 0 && i <= [self.buttons count]-2)
// hide all middle buttons
button.alpha = 0.0f;
else {
button.alpha = 1.0f;
NSString *title = [pathList objectAtIndex:i];
CGSize size = [title sizeWithFont:button.titleLabel.font];
CGFloat buttonWidth = size.width + 36.0f;
// check if the button width is greater than available space, if yes set the button width equal to the available space.
// The available space is reduced in editing move to make room for the move button.
if (self.editing && moveButton)
availableHSpace = contentRect.size.width - MOVE_BUTTON_WIDTH - 3.0f - 10.0f; // 10.0=space from move button
else
availableHSpace = contentRect.size.width;
if (x + buttonWidth > availableHSpace)
buttonWidth = availableHSpace - x;
button.frame = CGRectMake(x, y, buttonWidth, STANDARD_BUTTON_HEIGHT);
[button setTitle:title forState:UIControlStateNormal];
y += STANDARD_BUTTON_HEIGHT + 3.0f; // vertical distance between buttons
}
if (self.isExpanded)
x += 14.0f; // indentation
}
// setup cyan background
backgroundView.alpha = (self.isExpanded ? 0.80f : 0.0f);
CGRect backgroundViewFrame = backgroundView.frame;
if (self.isExpanded) {
// 10.0 = 5.0=y gap between backgroundView and self + 5.0=distance between edge
backgroundViewFrame.size.height = button.frame.origin.y + button.frame.size.height + 12.0f;
}
else
backgroundViewFrame.size.height = self.frame.size.height;
backgroundView.frame = backgroundViewFrame;
[UIView commitAnimations];
// set moveButton position and make it visible (put it out of animation block to avoid frame changing animation,
// fade animation already set from caller)
if (self.editing && moveButton) {
moveButton.frame = CGRectMake(0.0f, 0.0f, MOVE_BUTTON_WIDTH, STANDARD_BUTTON_HEIGHT*2 + 3.0f); // 3.0=vertical space between buttons
moveButton.center = CGPointMake(contentRect.size.width - MOVE_BUTTON_WIDTH/2 - 3.0f, contentRect.size.height/2);
moveButton.hidden = NO;
}
}
Being an error only the app-store version makes me suspicious of a project or target setting used to build the submission binary.
Are you using a project configuration to build the submission binary? If so, the first thing I would look for is a C macro is defined incorrectly for a release version. Or perhaps it is correct at the project-level, but incorrect at the target-level. Perhaps the end of your animation block is not correctly signalled?
Building an ad-hoc version of the app with the exact same settings as your app store version would be a good test. (Code signing would be the only difference.) Delete the old app from the device and deploy it the hard way through iTunes to be sure.
It might be your animation block blocking the main transition running behind. Try to avoid these kind of situation. For example popAviewController and just after push another this kind of situation lead to crash because you are doing another transition before previous one finished. Hope you understand.