TestFlight has identified a crash in my application that I can’t duplicate but it’s happening enough that I need to fix it. The error is unrecognized selector sent to instance 0x34a9e0 which I believe is caused when I try to assign a locationId to an object that was eliminated by the GC.
-[UIViewAnimationState locationId]: unrecognized selector sent to instance 0x34a9e0
0 CoreFoundation 0x371e488f __exceptionPreprocess + 163
1 libobjc.A.dylib 0x34ee9259 objc_exception_throw + 33
2 CoreFoundation 0x371e7a9b -[NSObject doesNotRecognizeSelector:] + 175
3 CoreFoundation 0x371e6915 ___forwarding___ + 301
4 CoreFoundation 0x37141650 _CF_forwarding_prep_0 + 48
5 Skate Spots 0x0000b9b9 -[DetailViewController handlePhotosButtonClick:] (DetailViewController.m:92)
6 CoreFoundation 0x3713e3fd -[NSObject performSelector:withObject:withObject:] + 53
7 UIKit 0x30ed3e07 -[UIApplication sendAction:to:from:forEvent:] + 63
8 UIKit 0x30ed3dc3 -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 31
9 UIKit 0x30ed3da1 -[UIControl sendAction:to:forEvent:] + 45
10 UIKit 0x30ed3b11 -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 493
11 UIKit 0x30ed4449 -[UIControl touchesEnded:withEvent:] + 477
12 UIKit 0x30ec6b87 _UIGestureRecognizerUpdate + 5223
13 CoreFoundation 0x371b8b1b __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 19
14 CoreFoundation 0x371b6d57 __CFRunLoopDoObservers + 259
15 CoreFoundation 0x371b70b1 __CFRunLoopRun + 761
16 CoreFoundation 0x3713a4a5 CFRunLoopRunSpecific + 301
17 CoreFoundation 0x3713a36d CFRunLoopRunInMode + 105
18 GraphicsServices 0x338f9439 GSEventRunModal + 137
19 UIKit 0x30ee6cd5 UIApplicationMain + 1081
20 Skate Spots 0x0000325f -[Image willSendWithObjectLoader:] (Image.m:83)
21 Skate Spots 0x00002b18 + 0
Original Code:
I assumed that autorelease would retain a reference during the scope of this method.
-(IBAction)handlePhotosButtonClick:(id)sender
{
PhotosViewController *vc = [[[PhotosViewController alloc] init] autorelease];
vc.locationID = _location.locationId;
[self.navigationController pushViewController:vc animated:YES];
}
My Code Change:
I’m guessing this will eliminate the original error but is this the correct way of doing it?
-(IBAction)handlePhotosButtonClick:(id)sender
{
NSLog(@"handlePhotosButtonClick");
PhotosViewController *vc = [[[PhotosViewController alloc] init] retain];
vc.locationID = _location.locationId;
[self.navigationController pushViewController:vc animated:YES];
[vc release];
}
Edit
You guys are correct _location was not set to retain the value.
@property (nonatomic, readwrite, assign) RKLocation *location;
So the selector sent is locationId (getter), not setLocationId: (the setter). It means, that’s not the autoreleased object (your view controller in this case) is that causing the error, since you SET its property so the runtime calls setLocationId: on it. It’s rater the
_locationobject that is getting deallocated somewhere, then another object takes over its pointer (it was an UIViewAnimationState in this particular case) and of course it doesn’t respond to the locationId getter. Try revising your code so that the _locationId variable is not deallocated until you need its properties.