Objective c 使用参数调用选择器时发生NSInvalidArgumentException
我试图使用选择器执行一个方法,其中一个NSString作为参数,但失败了。我见过很多这样的问题(和答案),尝试过大多数解决方案,但都没有成功。请参阅下面的代码和错误: MyObjective c 使用参数调用选择器时发生NSInvalidArgumentException,objective-c,selector,invalidargumentexception,Objective C,Selector,Invalidargumentexception,我试图使用选择器执行一个方法,其中一个NSString作为参数,但失败了。我见过很多这样的问题(和答案),尝试过大多数解决方案,但都没有成功。请参阅下面的代码和错误: MyMainView.m是我的视图控制器,它有一个方法: -(void)displayMessageOnTextView:(NSString *)message { [tv1 setText:message]; } 在MainView.h中: @interface MainView : UIViewController
MainView.m
是我的视图控制器,它有一个方法:
-(void)displayMessageOnTextView:(NSString *)message
{
[tv1 setText:message];
}
在MainView.h
中:
@interface MainView : UIViewController {
UITextView *tv1;
}
-(void)displayMessageOnTextView:(NSString *)message;
....
我有另一个由MainView触发的线程(这是来自MainView.m
):
和MyThread.m
:
- (void) runTest
{
MyThread *t = [[MyThread alloc] initWithInt:13253];
[t setMainView:self];
[t run];
[t release];
}
#import "MyThread.h"
#import "MainView.h"
@implementation MyThread
MainView *_view;
-(id)initWithInt:(int)someInt{
_view = NULL;
return self;
}
-(void)setMainView:(MainView*)view
{
_view = view;
}
-(int)run{
NSString *s = [NSString stringWithFormat:@"Display on Gui:%d", 1];
[_view performSelectorOnMainThread:@selector(displayMessageOnTextView:message:) withObject:s waitUntilDone:YES];
}
@end
错误:
2011-04-20 02:08:11.553 myApp[22627:207] -[MainView displayMessageOnTextView:message:]: unrecognized selector sent to instance 0x4e383a0
2011-04-20 02:08:11.555 myApp[22627:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MainView displayMessageOnTextView:message:]: unrecognized selector sent to instance 0x4e383a0'
*** Call stack at first throw:
(
0 CoreFoundation 0x00dc55a9 __exceptionPreprocess + 185
1 libobjc.A.dylib 0x00f19313 objc_exception_throw + 44
2 CoreFoundation 0x00dc70bb -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
3 CoreFoundation 0x00d36966 ___forwarding___ + 966
4 CoreFoundation 0x00d36522 _CF_forwarding_prep_0 + 50
5 Foundation 0x0079e94e __NSThreadPerformPerform + 251
6 CoreFoundation 0x00da68ff __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
7 CoreFoundation 0x00d0488b __CFRunLoopDoSources0 + 571
8 CoreFoundation 0x00d03d86 __CFRunLoopRun + 470
9 CoreFoundation 0x00d03840 CFRunLoopRunSpecific + 208
10 CoreFoundation 0x00d03761 CFRunLoopRunInMode + 97
11 GraphicsServices 0x00ffd1c4 GSEventRunModal + 217
12 GraphicsServices 0x00ffd289 GSEventRun + 115
13 UIKit 0x00025c93 UIApplicationMain + 1160
14 myApp 0x000024c9 main + 121
15 myApp 0x00002445 start + 53
)
terminate called after throwing an instance of 'NSException'
注:我是Objective-C(通常是iOS)编程的新手,因此任何关于编码约定和最佳实践的评论都将受到欢迎(即使与我的问题无关,但与我的代码相关)您的方法已声明为
-(void)displayMessageOnTextView:(NSString *)message;
这意味着方法名称是displayMessageContextView:
,相应的选择器是@selector(displayMessageContextView:)
。请注意,方法名称不包括参数(变量)名称
在-run
方法中,更改
[_view performSelectorOnMainThread:@selector(displayMessageOnTextView:message:)
withObject:s
waitUntilDone:YES];
到
运行时错误不应该再次发生
对于记录,对应于displaymessionContextView:message:
的方法声明将是:
- (void)displayMessageOnTextView:(type1)parameter1 message:(type2)parameter2;
您的方法已声明为
-(void)displayMessageOnTextView:(NSString *)message;
这意味着方法名称是displayMessageContextView:
,相应的选择器是@selector(displayMessageContextView:)
。请注意,方法名称不包括参数(变量)名称
在-run
方法中,更改
[_view performSelectorOnMainThread:@selector(displayMessageOnTextView:message:)
withObject:s
waitUntilDone:YES];
到
运行时错误不应该再次发生
对于记录,对应于displaymessionContextView:message:
的方法声明将是:
- (void)displayMessageOnTextView:(type1)parameter1 message:(type2)parameter2;
此方法:
-(void)displayMessageOnTextView:(NSString *)message
让选择器显示MessageContextView:。选择器中不显示参数本身的名称(message
)。(这应该有点直观:调用方法时名称不一定出现,因此它不出现在选择器中。)因此您需要使用@selector(displayMessageOnTextView:)
此方法:
-(void)displayMessageOnTextView:(NSString *)message
让选择器显示MessageContextView:。选择器中不显示参数本身的名称(
message
)。(这应该有点直观:调用方法时,名称不一定会出现,因此它不会出现在选择器中。)因此,您需要使用@selector(displayMessageOnTextView:)
首先,您是对的。它确实是这样工作的。第二,这是我的第一种方法,但由于某种原因,它不起作用。非常感谢。首先,你是对的。它确实是这样工作的。第二,这是我的第一种方法,但由于某种原因,它不起作用。非常感谢,谢谢约翰。(见对BAP的评论)谢谢约翰。(请参见对BAP的评论)