EXC_BAD_ACCESS无法识别的选择发送到实例
//adds a button to scroll list
-(void) addNode:(NSString *) atitle{
UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[btn setTitle:atitle forState:UIControlStateNormal];
[btn addTarget:self action:@selector(buttonTouched:) forControlEvents:UIControlEventTouchUpInside]; // handle touch
[buttons addObject:btn];
....
}
//a data button was pressed
-(void) buttonTouched:(id)sender{
int index = [buttons indexOfObject:sender];
NSString *key = [sender titleLabel].text;
}
@interface MainViewController : UIViewController <FlipsideViewControllerDelegate>
-(id) init{
self = [super init];
...
}
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] postNotificationName:@"ViewDidLoad" object:nil];
}
-(void) awakeFromNib{
[self loadData]; // loads some data
//calls addNode for a bunch of dynamic data
}
收到此错误:EXC_BAD_ACCESS无法识别的选择发送到实例
2010-07-29 10:19:45.428 DataManager[2945:207] -[NSCFString buttonTouched:]: unrecognized selector sent to instance 0x593abb0
2010-07-29 10:19:45.429 DataManager[2945:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSCFString buttonTouched:]: unrecognized selector sent to instance 0x593abb0'
*** Call stack at first throw:
(
0 CoreFoundation 0x02399919 __exceptionPreprocess + 185
1 libobjc.A.dylib 0x024e75de objc_exception_throw + 47
2 CoreFoundation 0x0239b42b -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
3 CoreFoundation 0x0230b116 ___forwarding___ + 966
4 CoreFoundation 0x0230acd2 _CF_forwarding_prep_0 + 50
5 UIKit 0x002bde14 -[UIApplication sendAction:to:from:forEvent:] + 119
6 UIKit 0x003476c8 -[UIControl sendAction:to:forEvent:] + 67
7 UIKit 0x00349b4a -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 527
8 UIKit 0x003486f7 -[UIControl touchesEnded:withEvent:] + 458
9 UIKit 0x00535070 _UIGestureRecognizerUpdateObserver + 3687
10 CoreFoundation 0x0237ad1b __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 27
11 CoreFoundation 0x0230f987 __CFRunLoopDoObservers + 295
12 CoreFoundation 0x022d8c17 __CFRunLoopRun + 1575
13 CoreFoundation 0x022d8280 CFRunLoopRunSpecific + 208
14 CoreFoundation 0x022d81a1 CFRunLoopRunInMode + 97
15 GraphicsServices 0x02bfe2c8 GSEventRunModal + 217
16 GraphicsServices 0x02bfe38d GSEventRun + 115
17 UIKit 0x002cbb58 UIApplicationMain + 1160
18 DataManager 0x00002940 main + 102
19 DataManager 0x000028d1 start + 53
)
terminate called after throwing an instance of 'NSException'
Program received signal: “SIGABRT”.
kill
kill
The Debugger has exited due to signal 15 (SIGTERM).The Debugger has exited due to signal 15 (SIGTERM).
是buttons
你初始化(我假设,因为你正在使用addObject
这是唯一的数组)的数组?你说它应该把它添加到一个滚动列表中(我猜你的意思是一个滚动视图),但是你给的错误使得它看起来像你将它传递给一个字符串对象。
要添加到滚动视图,你会怎么做:
[someScrollview addSubview:btn];
而且,我没有看到任何地方,你设置的对象,当它被添加到滚动视图的框架。这是你在将它作为子视图添加之前需要做的事情。
工作得很好,对我来说(注意,你应该初始化和地方释放可变数组,我只是做这个快):
控制台输出= 2010-07-29 15:54:54.563火炬[52222 :207]是的Hi和我用0
代码:
NSMutableArray *buttons; // in your .h interface
@property (nonatomic, retain) NSMutableArray *buttons; // in your .h
@synthesize buttons; // in your .m
(...)
-(IBAction) pushMyButtons {
buttons = [[NSMutableArray alloc] init];
UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[btn setTitle:@"Hi" forState:UIControlStateNormal];
[btn setFrame:CGRectMake(65, 300, 200, 23)];
[btn addTarget:self action:@selector(buttonTouched:) forControlEvents:UIControlEventTouchUpInside]; // handle touch
[buttons addObject:btn];
[self.view addSubview:btn];
}
//a data button was pressed
-(void) buttonTouched:(id)sender{
int index = [buttons indexOfObject:sender];
NSString *key = [sender titleLabel].text;
NSLog(@"Yep %@ and %d", key, index);
}
我在添加动作到按钮之前添加了[self retain];
,现在它可以工作!
-(void) addNode:(NSString *) atitle{
UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[btn setTitle:atitle forState:UIControlStateNormal];
[self retain];
[btn addTarget:self action:@selector(buttonTouched:) forControlEvents:UIControlEventTouchUpInside]; // handle touch
任何原因为什么?
自我是如果你正在使用ARC编译并通过编程设置选择,处理一切(至少我认为)
调用'[self retain];'打开大内存泄漏的大门,因为您将视图控制器的'retainCount'加1,并且永远不会再次释放该对象。这与动态创建按钮无关。 – iwasrobbed 2010-07-30 14:59:30
建议呢? – 2010-07-30 16:14:28
的UIViewController
:
[_backButton addTarget:self action:@selector(btnPressed:) forControlEvents:UIControlEventTouchUpInside];
的EXC_BAD_ACCESS因为我创造了一个父时,我然后将子视图添加到另一个视图。子视图(使用按钮)有其父级版本。一切都很好,直到按钮被选中,然后崩溃。
选择器的任何异常都可能是类发布问题。不应将保留用作工作(当然,在ARC编译中,您不能使用保留)。代码应该在可能释放对象的父对象的函数中检查可能的寡居指针。
希望有所帮助。
我的不好。我是新手。初始化期间是按钮阵列启动。是[scrollview addSubview:btn]。问题是当我按动态添加按钮。 – 2010-07-29 19:36:01
没有概率,只是试图获得尽可能多的信息:)看到我更新后的帖子,这对我来说很好。不是将它添加到scrollview中,而是将它添加到视图中,但实际上没有区别在两个。我制作了我的按钮标题“Hi” – iwasrobbed 2010-07-29 19:59:56
由于某种原因没有工作。不过谢谢。见上面的答案。 – 2010-07-30 14:37:19