2012-05-04 45 views
1

在我的应用程序中,我已经有一个按钮,这是一个实例变量已在.h文件中声明。 现在分配是一个分配的目标,并实际上按下按钮后,应用程序崩溃给我在调试器输出如下:UIButton调用选择器崩溃的应用程序

-[__NSCFString handleActionSheet:]: unrecognized selector sent to instance 0x9090330 
2012-05-04 17:51:02.646 financeAppV2[2595:f803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString handleActionSheet:]: unrecognized selector sent to instance 0x9090330' 
*** First throw call stack: 
(0x13d1022 0x1562cd6 0x13d2cbd 0x1337ed0 0x1337cb2 0x13d2e99 0x1e14e 0x1e0e6 0xc4ade 0xc4fa7 0xc3d8a 0x2dfa1a 0x13a599e 0x133c640 0x13084c6 0x1307d84 0x1307c9b 0x12ba7d8 0x12ba88a 0x1b626 0x29dd 0x2945) 
terminate called throwing an exceptionCurrent language: auto; currently objective-c 

我的代码看起来像以下:

saveButton=[UIButton buttonWithType:UIButtonTypeCustom]; 
[saveButton setBackgroundImage:[UIImage imageNamed:@"intervalbutton"] forState:UIControlStateNormal]; 
[saveButton setBackgroundImage:[UIImage imageNamed:@"intervalbuttonpressed"] forState:UIControlStateHighlighted]; 
saveButton.alpha=.8; 
saveButton.frame= frame; 
UILabel* label=[[UILabel alloc]initWithFrame:CGRectMake(0, 2, saveButton.frame.size.width, 21)]; 
[saveButton addSubview:label]; 

[saveButton addTarget:self action:@selector(handleActionSheet:) forControlEvents:UIControlEventTouchDown]; 

[self.view addSubview:saveButton]; 


-(void)handleActionSheet:(id)sender{ 
NSLog(@"working"); 

}

任何想法为什么应用程序可能会崩溃?

+0

这样还是会发生,如果你注释'[saveButton addSubview:label];'? – Costique

+0

是的。事实上,我甚至得到一个陌生人的错误: - [_ UITableViewSeparatorView handleActionSheet:]:无法识别的选择器发送到实例0x6a89a30 2012-05-04 18:12:52.485 financeAppV2 [2997:f803] ***由于未捕获的异常终止应用程序'NSInvalidArgumentException' 的,理由是: ' - [_ UITableViewSeparatorView handleActionSheet:]:无法识别的选择发送到实例0x6a89a30' ***第一掷调用堆栈: (0x13d1022 0x1562cd6 0x13d2cbd 0x1337ed0 0x1337cb2 0x13d2e99 0x1e14e 0x1e0e6 0xc4ade 0xc4fa7 0xc3d8a 0x2dfa1a 0x13a599e 0x133c640 0x13084c6 0x1307d84 0x1307c9b 0x12ba7d8 0x12ba88a 0x1 ... – iJatrat

回答

5

没有看到你的代码的其余部分是很难做到具体,但self不正确被保留。

您正确设置了您的按钮(据我所知)并将目标指向self。不幸的是,当您按下按钮self已经超出范围并且NSString使用相同的内存时。当您发送字符串handleActionSheet:消息时,iOS会感到惊讶。

+0

什么表示你'自我'没有妥善保留?也可能是其他一些事情,对吧? – mbm29414

+0

谢谢Stephen!我通过你的指导发现了什么问题。 放置按钮的viewcontroller不是实例变量。这就是为什么我认为ARC太早发布它。我为该viewcontroller做了一个属性,然后它就工作了!非常感谢! – iJatrat

1

您正在向__NSCFString对象发送消息initAllIVars:(可能是NSString)。

搜索该消息并尝试找出接收消息的对象为什么是NSString

+0

我刚刚编辑了帖子并放入了一个不同的选择器来调用,但是出现了相同的错误信息,但是使用了更新的选择器,这对我而言也是个谜,为什么NSString会收到消息而不是UIButton – iJatrat

+1

每当一个对象突然“改变类型”时,它通常表示你已经过度释放该对象,并且内存正在被别的东西重新使用。在你的代码中设置一个断点,然后在将**添加到'[self view]'之前检查'saveButton' **的内存地址。然后,检查至少它是否是抛出异常的相同内存地址。如果是这样,你有一个内存错误追踪! – mbm29414

+0

谢谢!我会检查出来的。 – iJatrat

0

刚刚测试过你的代码,它的工作原理。也许帧它没有正确设置

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    UIButton *saveButton = [[UIButton alloc] init]; 
    saveButton=[UIButton buttonWithType:UIButtonTypeCustom]; 
    [saveButton setBackgroundImage:[UIImage imageNamed:@"intervalbutton"] forState:UIControlStateNormal]; 
    [saveButton setBackgroundImage:[UIImage imageNamed:@"intervalbuttonpressed"] forState:UIControlStateHighlighted]; 
    saveButton.alpha=.8; 
    saveButton.frame= CGRectMake(5, 5, 200, 40); 
    UILabel* label=[[UILabel alloc]initWithFrame:CGRectMake(0, 2, saveButton.frame.size.width, 21)]; 
    label.text = @"Hello"; 
    [saveButton addSubview:label]; 

    [saveButton addTarget:self action:@selector(handleActionSheet:) forControlEvents:UIControlEventTouchDown]; 

    [self.view addSubview:saveButton]; 

} 

-(void)handleActionSheet:(id)sender{ 
    NSLog(@"working"); 
} 
+0

感谢您的测试。事情是我将应用程序移植到iPad上,并简单地复制了实际上在iPhone上工作的代码。但突然它停止工作。 – iJatrat

+0

未能设置框架不会导致对象过早释放。 –