Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c UIButton调用选择器会使应用程序崩溃_Objective C_Ios_Cocoa Touch_Cocoa - Fatal编程技术网

Objective c UIButton调用选择器会使应用程序崩溃

Objective c UIButton调用选择器会使应用程序崩溃,objective-c,ios,cocoa-touch,cocoa,Objective C,Ios,Cocoa Touch,Cocoa,在我的应用程序中,我有一个按钮,它是一个在.h文件中声明的实例变量。 现在,在为它分配了一个assigning at target并实际按下按钮后,应用程序崩溃,在调试器中给出以下输出: -[__NSCFString handleActionSheet:]: unrecognized selector sent to instance 0x9090330 2012-05-04 17:51:02.646 financeAppV2[2595:f803] *** Terminating app due

在我的应用程序中,我有一个按钮,它是一个在.h文件中声明的实例变量。 现在,在为它分配了一个assigning at target并实际按下按钮后,应用程序崩溃,在调试器中给出以下输出:

-[__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");
}


你知道为什么应用程序会崩溃吗?

你正在向
\NSCFString
对象(可能是
NSString
)发送一条名为
initAllIVars:
的消息


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

您正在向
\NSCFString
对象(可能是
NSString
)发送名为
initAllIVars:
的消息


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

刚刚测试了您的代码,它可以正常工作。可能是框架设置不正确

- (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");
}

刚刚测试了你的代码,它就可以工作了。可能是框架设置不正确

- (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");
}

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


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

如果看不到你的其余代码,就很难确定,但是
self
没有正确地被保留


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

我刚刚编辑了这篇文章,并输入了另一个要调用的选择器。但是,会显示相同的错误消息,但会使用更新的选择器。对于我来说,这也是一个谜,为什么NSString接收到的是发送的消息,而不是UIButton当一个对象突然“改变类型”时,它通常表示您过度释放了该对象,并且内存被其他对象重复使用。在代码中设置断点并检查
保存按钮的内存地址,然后将其添加到
[自查看]
。然后,检查是否至少是相同的内存地址引发了异常。如果是这样,你就有一个内存错误要跟踪!我刚刚编辑了这篇文章,并输入了一个不同的选择器来调用。但是,会显示相同的错误消息,但会使用更新的选择器。对于我来说,这也是一个谜,为什么NSString接收到的是发送的消息,而不是UIButton当一个对象突然“改变类型”时,它通常表示您过度释放了该对象,并且内存被其他对象重复使用。在代码中设置断点并检查
保存按钮的内存地址,然后将其添加到
[自查看]
。然后,检查是否至少是相同的内存地址引发了异常。如果是这样,你就有一个内存错误要跟踪!如果您注释掉
[saveButton addSubview:label],这种情况还会发生吗?是的。事实上,我甚至收到了一个奇怪的错误:-[\u UITableViewSeparatorView handleActionSheet:]:无法识别的选择器发送到实例0x6a89a30 2012-05-04 18:12:52.485 financeAppV2[2997:f803]***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[\u UITableViewSeparatorView handleActionSheet:]:发送到实例0x6a89a30'***的无法识别的选择器第一次抛出调用堆栈:(0x13d1022 0x1562cd6 0x13d2cbd 0x1337ed0 0x1337cb2 0x13d2e99 0x1e14e 0x1e0e6 0xc4ade 0xc4fa7 0xc3d8a 0x2dfa1a 0x13a599e 0x133c640 0x13084c6 0x1307d84 0x1307c9b 0x12ba7d8 0x12ba88a 0x1…如果注释掉
[saveButton addSubview:label]
?是的。事实上,我甚至收到了一个奇怪的错误:-[\u UITableViewSeparatorView handleActionSheet:]:无法识别的选择器发送到实例0x6a89a30 2012-05-04 18:12:52.485 financeAppV2[2997:f803]***由于未捕获的异常“NSInvalidArgumentException”,终止应用程序,原因:'-[\u UITableViewSeparatorView handleActionSheet:]:发送到实例0x6a89a30'***第一次抛出调用堆栈的选择器无法识别:(0x13d1022 0x1562cd6 0x13d2cbd 0x1337ed0 0x1337cb2 0x133D2E99 0x1e14e 0x1e0e6 0xc4ade 0xc4fa7 0xc3d8a 0x2dfa1a 0x13a599e 0x133c640 0x13084c6 0x1307d84 0x1307c9b 0x12ba7d8 0x12ba88a 0x1…感谢您的测试。问题是我正在将应用程序移植到iPad上,并简单地复制了实际在iPhone上工作的代码。但突然,它停止了正在工作。未能设置框架不会导致对象过早释放。感谢您的测试。问题是我将应用程序移植到iPad,只是复制了iPhone上实际工作的代码。但突然它停止了工作。未能设置框架不会导致对象过早释放。什么指示向您表示,
self
没有正确保留?可能还有其他一些问题,对吗?谢谢Stephen!我通过您的指导发现了问题所在。我的按钮所在的viewcontroller不是实例变量。这就是为什么我认为ARC发布它太早的原因。我为该viewcontrolle创建了一个属性r然后它就成功了!非常感谢!是什么向您表明
self
没有正确保留?可能还有其他一些东西,对吧?谢谢Stephen!我通过您的指导发现了问题所在。我的按钮所在的viewcontroller不是一个实例变量。这就是为什么我认为ARC也发布了它我为那个viewcontroller做了一个属性,然后它就工作了!非常感谢!