&引用;已将无法识别的选择器发送到实例";Objective-C中的错误
我创建了一个按钮并为其添加了一个操作,但一旦它被调用,我就得到了以下错误:&引用;已将无法识别的选择器发送到实例";Objective-C中的错误,objective-c,selector,unrecognized-selector,Objective C,Selector,Unrecognized Selector,我创建了一个按钮并为其添加了一个操作,但一旦它被调用,我就得到了以下错误: -[NSCFDictionary numberButtonClick:]: unrecognized selector sent to instance 0x3d03ac0 2010-03-16 22:23:58.811 Money[8056:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reaso
-[NSCFDictionary numberButtonClick:]: unrecognized selector sent to instance
0x3d03ac0 2010-03-16 22:23:58.811
Money[8056:207] *** Terminating app
due to uncaught exception
'NSInvalidArgumentException', reason:'*** -[NSCFDictionary numberButtonClick:]: unrecognized selector sent to instance 0x3d03ac0'
这是我的代码:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
UIButton *numberButton = [UIButton buttonWithType:UIButtonTypeCustom];
numberButton.frame = CGRectMake(10, 435, 46, 38);
[numberButton setImage:[UIImage imageNamed:@"one.png"] forState:UIControlStateNormal];
[numberButton addTarget:self action:@selector(numberButtonClick:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview: numberButton];
}
return self;
}
-(IBAction)numberButtonClick:(id)sender{
NSLog(@"---");
}
看起来您没有正确地管理视图控制器的内存,并且它在某个点被释放-这导致
numberButtonClicked:
方法被发送到另一个对象,该对象现在正在占用视图控制器以前占用的内存
确保您正确地保留/释放了视图控制器。对于那些像我一样通过谷歌来到这里的人来说,这可能更多地涉及到Xcode 4.2+/iOS 5+以及ARC。我遇到了相同的错误“发送到实例的选择器无法识别”。在我的例子中,我将UIButton的目标操作设置为将其自身作为发送方参数传递,但后来意识到我不需要它,并在代码中删除了它。比如说:
- (IBAction)buttonPressed:(UIButton *)sender {
更改为:
- (IBAction)buttonPressed {
右键单击有问题的UIButton显示“内部润色”事件与view Controller buttonPressed:方法关联。删除此项并将其重新分配给修改后的方法非常有效。这是谷歌针对此问题的最佳答案,但我有一个不同的原因/结果-我想我应该加上我的两分钱,以防其他人偶然发现此问题 就在今天早上,我也遇到了类似的问题。我发现,如果右键单击给出问题的UI项,您可以看到已创建了哪些连接。在我的情况下,我有一个按钮连接到两个行动。我删除了右键菜单中的操作,并重新布线,我的问题得到了解决
因此,请确保您的操作连接正确。我认为您应该使用void,而不是返回类型中的iAction。因为您以编程方式定义了一个按钮 在我的例子中,我使用的是NSNotificationCenter,试图使用不带参数的选择器,但添加了冒号。移除冒号修复了问题 使用选择器名称时,如果没有参数,则不要使用尾随冒号。如果有一个参数,则使用一个尾随冒号。如果有多个参数,则必须为每个参数命名这些参数,并在后面加上冒号
请参见Adam Rosenfield的回答:如果不在interface builder中设置视图的“类”,也可能发生这种情况。我正在回复Leonard Challis,因为我也使用了斯坦福iOS类C193P,就像用户“oli206”一样 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因: 问题是,我将计算器上的“回车”按钮连接了两次,一位朋友指出,当我右键单击“回车”按钮时,对故事板上的按钮进行检查时,发现“内部润色”属性上有两个条目。删除“已发送事件”中的两个“内部修补”中的一个解决了问题
这表明问题是由两个发送事件触发的(对于作业1计算器演练中的C193P视频类),其中一个事件导致异常。我也有类似的问题,但对我来说,解决方案略有不同。在我的例子中,我使用了一个类别来扩展一个现有的类(UIImage提供了一些调整大小的功能——如果您感兴趣,请参见此),但忘记了将*.m文件添加到构建目标中。愚蠢的错误,但当它发生在哪里时并不总是显而易见的。我认为它值得分享…如果不将ViewController分配给中的ViewControllerScene,则可能会发生这种情况
接口生成器。因此ViewController.m未连接到任何场景。包括我的共享。我在这个问题上陷入了一段时间,直到我意识到我已经创建了一个残疾人项目。在该选项上快速设置为“是”解决了我的问题。另一个非常愚蠢的原因是在接口(.h)中定义了选择器,但在实现(.m)中没有定义选择器(即键入)要添加到列表中的另一个原因/解决方案。这是由iOS6.0(和/或编程错误)引起的。在旧版本中,如果参数类型匹配,选择器将匹配,但在iOS 6.0中,我在以前的工作代码中遇到了参数名称不正确的崩溃 我在做类似的事情
[objectName methodName:@"somestring" lat:latValue lng:lngValue];
但在定义中(包括.h和.m),我有
这在iOS5上运行良好,但在ios6上却不行,即使是部署到不同设备上的完全相同的构建
无论如何,我不明白为什么编译器不能告诉我这一点-问题就在于此。当您想将ControllerA中的属性设置为自定义ControllerB类中的公共属性,但尚未设置“自定义类”时,也可能会发生这种情况在故事板中的身份检查器内部。另一种可能的解决方案:在链接器参数中添加“-ObjC” 详细解释如下:
我认为要点是:如果类别是在静态链接的库中定义的,那么链接器不够聪明,无法链接类别方法。上面的标志使链接器链接到所有的objective C类和类别中,而不仅仅是它认为需要基于对源代码的分析来链接的类和类别。(请随意调整或更正该答案。我知道链接语言,所以我只是在这里鹦鹉学舌)。在我的情况下,函数不需要参数,但按钮被配置为发送一个导致错误的参数。要解决这个问题,我必须重新连接事件处理程序 以下是我的功能: 请注意,它不包含任何参数 这是我的按钮配置的图像(右键单击按钮查看): 请注意,有3个事件处理程序 为了解决这个问题,我必须删除每个事件项,因为其中一个事件项正在向enterPressed函数发送对自身的引用。要删除这些项目,我单击每个项目名称旁边的小x图标,直到没有显示任何项目 接下来,我必须将按钮重新连接到事件。去
(viod) methodName:(NSString *) latitude:(double)latitude longitude:(double)longitude;
NSArray* array = [[NSArray alloc] init];
[(NSDictionary*)array objectForKey: key]; // array is not a dictionary, hence exception
action:@selector(xxxButtonClick:)
or (as in my case)
action:NSSelectorFromString([[NSString alloc] initWithFormat:@"%@BtnTui:", name.lowercaseString])
- (void)doneBtnTui:(id)sender {
NSLog(@"Done Button - with sender");
}
or
- (void)doneBtnTui {
NSLog(@"Done Button - no sender");
}
[self.refreshControl addTarget:self action:@selector(yourRefreshMethod:) forControlEvents:UIControlEventValueChanged];
- (void)yourRefreshMethod{
(your code here)
}
- (void)yourRefreshMethod:(id)sender{
(your code here)
}
- (void)yourRefreshMethodWithSender:(id)sender{
[self yourRefreshMethod];
}
[self.refreshControl addTarget:self action:@selector(yourRefreshMethodWithSender:) forControlEvents:UIControlEventValueChanged];
var trashBarButtonItem: UIBarButtonItem {
return UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "newButtonClicked")
}
func newButtonClicked(barButtonItem: UIBarButtonItem) {
NSLog("A bar button item on the default toolbar was clicked: \(barButtonItem).")
}
var trashBarButtonItem: UIBarButtonItem {
return UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "newButtonClicked:")
}
func newButtonClicked(barButtonItem: UIBarButtonItem) {
NSLog("A bar button item on the default toolbar was clicked: \(barButtonItem).")
}
set.Bind (somethingOutlet).For ("TouchUpInside").To(vm => vm.Something);
*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '-[NameOfYourApp.NameOfYourClass nameOfCorruptConnection:]:
unrecognized selector sent to instance 0x7f97a48bb000'
[UITableViewCellContentView image]: unrecognized selector sent to instance
[__NSDictionaryI objectAtIndex:] unrecognized selector sent to instance
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[TestApp.MyViewController viewDidLoad:]: unrecognized selector sent to instance 0xDABCDD'
-[NSObject(NSObject) doesNotRecognizeSelector:]