问题
I've been bashing my head in with this one for the past half hour, so I thought I'd ask my friends from Stack Overflow for some wisdom.
I've got a tab bar application with a view controller at the root, and passing off the views to other xib
s. I created a custom XIB and added its view controller class (MoreViewController
) as an External Object
in Interface Builder. When I link my methods, I get a SIGABRT
error when calling the method with a UIButton
:
Method
- (IBAction)showAbout {
alert = [[[UIAlertView alloc] initWithTitle:@"About" message:@"yadda yadda yadda some message" delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles:nil] autorelease];
[alert show];
}
Stack
2010-09-17 18:01:40.714 <appname>[7963:207] -[__NSCFType showAbout]: unrecognized selector sent to instance 0x5f6ef10
2010-09-17 18:01:40.716 <appname>[7963:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFType showAbout]: unrecognized selector sent to instance 0x5f6ef10'
*** Call stack at first throw:
(
0 CoreFoundation 0x0247eb99 __exceptionPreprocess + 185
1 libobjc.A.dylib 0x025ce40e objc_exception_throw + 47
2 CoreFoundation 0x024806ab -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
3 CoreFoundation 0x023f02b6 ___forwarding___ + 966
4 CoreFoundation 0x023efe72 _CF_forwarding_prep_0 + 50
5 UIKit 0x002b07f8 -[UIApplication sendAction:to:from:forEvent:] + 119
6 UIKit 0x0033bde0 -[UIControl sendAction:to:forEvent:] + 67
7 UIKit 0x0033e262 -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 527
8 UIKit 0x0033ce0f -[UIControl touchesEnded:withEvent:] + 458
9 UIKit 0x002d43d0 -[UIWindow _sendTouchesForEvent:] + 567
10 UIKit 0x002b5cb4 -[UIApplication sendEvent:] + 447
11 UIKit 0x002ba9bf _UIApplicationHandleEvent + 7672
12 GraphicsServices 0x02d5e822 PurpleEventCallback + 1550
13 CoreFoundation 0x0245fff4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
14 CoreFoundation 0x023c0807 __CFRunLoopDoSource1 + 215
15 CoreFoundation 0x023bda93 __CFRunLoopRun + 979
16 CoreFoundation 0x023bd350 CFRunLoopRunSpecific + 208
17 CoreFoundation 0x023bd271 CFRunLoopRunInMode + 97
18 GraphicsServices 0x02d5d00c GSEventRunModal + 217
19 GraphicsServices 0x02d5d0d1 GSEventRun + 115
20 UIKit 0x002beaf2 UIApplicationMain + 1160
21 <appname> 0x00001b30 main + 102
22 <appname> 0x00001ac1 start + 53
)
terminate called after throwing an instance of 'NSException'
Program received signal: “SIGABRT”.
[Switching to process 7963]
(gdb)
Can someone shed some light on this?
Thanks in advance!
EDIT Ok, I've enabled NSZombie and... I get a less cryptic error! Woohoo!
2010-09-17 18:48:56.576 <appname>[8088:207] *** -[MoreViewController performSelector:withObject:withObject:]: message sent to deallocated instance 0x5fa98e0
EDIT 2 With Instruments' Zombie Mode, I've managed to uncover the contents of the memory address, listed below:
# Category Event Type RefCt Timestamp Address Size Responsible Library Responsible Caller
0 MoreViewController Malloc 1 2968170752 0x5fa5ee0 144 UIKit -[UIClassSwapper initWithCoder:]
1 MoreViewController Retain 2 2968226816 0x5fa5ee0 0 UIKit -[UIRuntimeConnection initWithCoder:]
2 MoreViewController Retain 3 2968229888 0x5fa5ee0 0 Foundation -[NSKeyedUnarchiver _replaceObject:withObject:]
3 MoreViewController Release 2 2968232704 0x5fa5ee0 0 UIKit -[UIRuntimeConnection initWithCoder:]
4 MoreViewController Retain 3 2968236800 0x5fa5ee0 0 UIKit -[UIRuntimeConnection initWithCoder:]
5 MoreViewController Autorelease 2968259840 0x5fa5ee0 0 UIKit -[UIRuntimeConnection initWithCoder:]
6 MoreViewController Retain 4 2968262912 0x5fa5ee0 0 UIKit -[UIRuntimeConnection initWithCoder:]
7 MoreViewController Retain 5 2968322816 0x5fa5ee0 0 UIKit -[UIRuntimeConnection initWithCoder:]
8 MoreViewController Autorelease 2968324864 0x5fa5ee0 0 UIKit -[UIRuntimeConnection initWithCoder:]
9 MoreViewController Retain 6 2968331776 0x5fa5ee0 0 UIKit -[UIRuntimeConnection initWithCoder:]
10 MoreViewController Retain 7 2986161920 0x5fa5ee0 0 UIKit -[UIRuntimeConnection initWithCoder:]
11 MoreViewController Autorelease 2986163712 0x5fa5ee0 0 UIKit -[UIRuntimeConnection initWithCoder:]
12 MoreViewController Retain 8 2986166784 0x5fa5ee0 0 UIKit -[UIRuntimeConnection initWithCoder:]
13 MoreViewController Retain 9 2986367744 0x5fa5ee0 0 UIKit -[UIRuntimeConnection initWithCoder:]
14 MoreViewController Autorelease 2986369792 0x5fa5ee0 0 UIKit -[UIRuntimeConnection initWithCoder:]
15 MoreViewController Retain 10 2986371840 0x5fa5ee0 0 UIKit -[UIRuntimeConnection initWithCoder:]
16 MoreViewController Release 9 2986498816 0x5fa5ee0 0 UIKit -[UINib instantiateWithOwner:options:]
17 MoreViewController Release 8 2986510848 0x5fa5ee0 0 UIKit -[UINib instantiateWithOwner:options:]
18 MoreViewController Release 7 2986524928 0x5fa5ee0 0 UIKit -[UINib instantiateWithOwner:options:]
19 MoreViewController Release 6 2986529792 0x5fa5ee0 0 UIKit -[UINib instantiateWithOwner:options:]
20 MoreViewController Retain 7 2986635008 0x5fa5ee0 0 Foundation -[NSKeyedUnarchiver _decodeArrayOfObjectsForKey:]
21 MoreViewController Retain 8 2986648832 0x5fa5ee0 0 Foundation -[NSKeyedUnarchiver _decodeArrayOfObjectsForKey:]
22 MoreViewController Release 7 2986650880 0x5fa5ee0 0 Foundation -[NSKeyedUnarchiver _decodeArrayOfObjectsForKey:]
23 MoreViewController Retain 8 2986679040 0x5fa5ee0 0 Foundation -[NSArray(NSArray) initWithCoder:]
24 MoreViewController Release 7 2986705920 0x5fa5ee0 0 UIKit -[UINib instantiateWithOwner:options:]
25 MoreViewController Retain 8 2986823936 0x5fa5ee0 0 Foundation -[NSKeyedUnarchiver _decodeArrayOfObjectsForKey:]
26 MoreViewController Retain 9 2986860800 0x5fa5ee0 0 Foundation -[NSKeyedUnarchiver _decodeArrayOfObjectsForKey:]
27 MoreViewController Release 8 2986900736 0x5fa5ee0 0 Foundation -[NSKeyedUnarchiver _decodeArrayOfObjectsForKey:]
28 MoreViewController Retain 9 2986923776 0x5fa5ee0 0 Foundation -[NSArray(NSArray) initWithCoder:]
29 MoreViewController Release 8 2986969856 0x5fa5ee0 0 UIKit -[UINib instantiateWithOwner:options:]
30 MoreViewController Retain 9 2987261952 0x5fa5ee0 0 UIKit -[UINib instantiateWithOwner:options:]
31 MoreViewController Release 8 2987425792 0x5fa5ee0 0 Foundation -[NSKeyedUnarchiver dealloc]
32 MoreViewController Release 7 2987520000 0x5fa5ee0 0 Foundation -[NSKeyedUnarchiver dealloc]
33 MoreViewController Release 6 2987686656 0x5fa5ee0 0 Foundation -[NSKeyedUnarchiver dealloc]
34 MoreViewController Release 5 2987698944 0x5fa5ee0 0 Foundation -[NSKeyedUnarchiver dealloc]
35 MoreViewController Release 4 2987756032 0x5fa5ee0 0 UIKit -[UIRuntimeConnection dealloc]
36 MoreViewController Release 3 2987793920 0x5fa5ee0 0 UIKit -[UIRuntimeConnection dealloc]
37 MoreViewController Release 2 2987811840 0x5fa5ee0 0 UIKit -[UIRuntimeConnection dealloc]
38 MoreViewController Release 1 2987849984 0x5fa5ee0 0 UIKit -[UIRuntimeConnection dealloc]
39 MoreViewController Release 0 2994390016 0x5fa5ee0 0 Foundation -[NSAutoreleasePool release]
40 MoreViewController Zombie -1 6312182784 0x5fa5ee0 0 UIKit -[UIApplication sendAction:to:from:forEvent:]
I did notice that -[NSAutoreleasePool release]
is called before -[UIApplication sendAction:to:from:forEvent:]
... could that be my problem? How would I resolve that?
Thanks again for your responses, every one helps.
EDIT 4
Output from info malloc
command:
2010-09-17 19:41:57.305 <appname>[8440:207] *** -[MoreViewController performSelector:withObject:withObject:]: message sent to deallocated instance 0x63ae170
[Switching to process 8440]
(gdb) info malloc 0x63ae170
Alloc: Block address: 0x063ae170 length: 132
Stack - pthread: 0xa0541500 number of frames: 49
0: 0x947170c3 in malloc_zone_calloc
1: 0x9471701a in calloc
2: 0x25cdb5b in _internal_class_createInstanceFromZone
3: 0x25d07a6 in class_createInstance
4: 0x23a3108 in +[NSObject(NSObject) allocWithZone:]
5: 0x23a2f0a in +[NSObject(NSObject) alloc]
6: 0x4a6039 in -[UIClassSwapper initWithCoder:]
7: 0x1669c in _decodeObjectBinary
8: 0x15809 in _decodeObject
9: 0x4a5d77 in -[UIRuntimeConnection initWithCoder:]
10: 0x4a62e5 in -[UIRuntimeEventConnection initWithCoder:]
11: 0x1669c in _decodeObjectBinary
12: 0x1746d in -[NSKeyedUnarchiver _decodeArrayOfObjectsForKey:]
13: 0x17a9c in -[NSArray(NSArray) initWithCoder:]
14: 0x1669c in _decodeObjectBinary
15: 0x15809 in _decodeObject
16: 0x4a5034 in -[UINib instantiateWithOwner:options:]
17: 0x4a6eb5 in -[NSBundle(UINSBundleAdditions) loadNibNamed:owner:options:]
18: 0x35c95f in -[UIViewController _loadViewFromNibNamed:bundle:]
19: 0x35a675 in -[UIViewController loadView]
20: 0x35a54f in -[UIViewController view]
21: 0x36c73e in -[UITabBarController transitionFromViewController:toViewController:transition:shouldSetSelected:]
22: 0x36b2b2 in -[UITabBarController transitionFromViewController:toViewController:]
23: 0x36d08c in -[UITabBarController _setSelectedViewController:]
24: 0x36cefb in -[UITabBarController _tabBarItemClicked:]
25: 0x2b07f8 in -[UIApplication sendAction:to:from:forEvent:]
26: 0x4ad2d0 in -[UITabBar _sendAction:withEvent:]
27: 0x2b07f8 in -[UIApplication sendAction:to:from:forEvent:]
28: 0x33bde0 in -[UIControl sendAction:to:forEvent:]
29: 0x33e262 in -[UIControl(Internal) _sendActionsForEvents:withEvent:]
30: 0x33bd97 in -[UIControl sendActionsForControlEvents:]
31: 0x2b07f8 in -[UIApplication sendAction:to:from:forEvent:]
32: 0x33bde0 in -[UIControl sendAction:to:forEvent:]
33: 0x33e262 in -[UIControl(Internal) _sendActionsForEvents:withEvent:]
34: 0x33ce0f in -[UIControl touchesEnded:withEvent:]
35: 0x2d43d0 in -[UIWindow _sendTouchesForEvent:]
36: 0x2b5cb4 in -[UIApplication sendEvent:]
37: 0x2ba9bf in _UIApplicationHandleEvent
38: 0x2d5e822 in PurpleEventCallback
39: 0x245fff4 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__
40: 0x23c0807 in __CFRunLoopDoSource1
41: 0x23bda93 in __CFRunLoopRun
42: 0x23bd350 in CFRunLoopRunSpecific
43: 0x23bd271 in CFRunLoopRunInMode
44: 0x2d5d00c in GSEventRunModal
45: 0x2d5d0d1 in GSEventRun
46: 0x2beaf2 in UIApplicationMain
47: 0x1a78 in main at /Users/Sean/Desktop/<appname>/main.m:13
48: 0x1a09 in start
EDIT 5
I still haven't figured this out... can ANYONE help?
回答1:
You are getting this because the object you are sending showAbout: to doesn't respond to that selector. Either you are pointing the the wrong target, or your target's pointer is being changed.
It's tough to say without seeing a little more code. If you are creating the button in IB, you probably don't have your outlets hooked up properly.
Edit: Based on your new code, it looks like your MoveViewController object isn't being retained properly. To get info about the instance you specificed, you can turn on MallocStackLoggingNoCompact the same way you turned on NSZombieEnabled. When you get your error, you can use either
malloc_history INSTANCE_ADDRESS
or
info malloc INSTANCE_ADDRESS
This is a great article for this kind of debugging
http://www.friday.com/bbum/2010/01/10/using-malloc-to-debug-memory-misuse-in-cocoa/
回答2:
I didn't figure out the cause, but the errors were resolved by moving the views into one XIB
.
Thanks anyway.
来源:https://stackoverflow.com/questions/3739405/weird-sigabrt-unrecognized-selector-sent-to-instance-when-using-uialertview