我正在讨论使用选择器的this示例。为方便起见,我从那里复制了代码。
// MYTapGestureRecognizer.h
@interface MYTapGestureRecognizer : UITapGestureRecognizer
@property (nonatomic, strong) NSString *data;
@end
// MYTapGestureRecognizer.m
@implementation MYTapGestureRecognizer
@end
// =====================
....
MYTapGestureRecognizer *singleTap = [[MYTapGestureRecognizer alloc] initWithTarget:self action:@selector(tapDetected:)];
singleTap.data = @"Hello";
.....
// ====================
-(void)tapDetected:(UITapGestureRecognizer *)tapRecognizer {
MYTapGestureRecognizer *tap = (MYTapGestureRecognizer *)tapRecognizer;
NSLog(@"data : %@", tap.data);
}
我的问题是
1 - 当self
调用选择器时,它在上述情况下传递了哪个参数?
2-如果调用选择器(指向需要参数的方法)(参见下面的示例)并且没有传递参数,那么在这种情况下是否有任何默认值?如果可能,是否有任何文件?
假设MyTest的签名是
- (void) MyTest : (NSString*) a;
现在构建并调用选择器
SEL a = NSSelectorFromString(@"MyTest:");
[t performSelector:a]; //Works Fine and the call is made - However Notice no parameter is passed . In this case what would the value of the parameter be in the method ?
我检查了以下内容,但我找不到此信息
答案 0 :(得分:1)
您的问题的答案: -
如果检测到点击并且调用了选择器,则该参数将是UITapGestureRecognizer
的对象。这将是检测到轻击手势的相同实例。
为什么要这样调用方法,有什么特殊目的吗?如果没有,您可以像
一样调用该方法 [self tapDetected:nil];
或
[self performSelector:@selector(tapDetected:) withObject:nil];
如果你按照问题中提供的方法调用方法,很可能它会崩溃。
答案 1 :(得分:0)
通常,如果您想通过self访问该选择器,请使用它:
[self tapDetected:nil];
您需要在选择器中处理此案例,例如:
-(void)tapDetected:(UITapGestureRecognizer *)tapRecognizer {
if (tapRecognizer)
{
MYTapGestureRecognizer *tap = (MYTapGestureRecognizer *)tapRecognizer;
NSLog(@"data : %@", tap.data);
}
else
{
//Do your work
}
}
此外,不仅如此,如果您不确定要传递的参数,请将选择器decalartion更改为id
,如:
-(void)tapDetected:(id)sender {
NSString *className = NSStringFromClass([id class]);
NSLog(@"Object passed is of class : %@", className);
//And make check here
if ([id isKindOfClass:[MYTapGestureRecognizer class]])
{
//Do your work here
}
}
没有默认情况,您需要手动处理每个案例,否则应用程序将崩溃。
答案 2 :(得分:0)
如果您希望在self上调用该方法,请将nil参数传递给它。但我不明白它为你服务的目的是什么。
此外,如果您不向您的方法发送参数,它将在您的构建中失败。您必须传递参数或nil。
此外,如果您的方法不接受nil参数,则可能会导致异常 - 'NSInvalidArgumentException'
答案 3 :(得分:0)
SEL a = NSSelectorFromString(@"MyTest:"); [t performSelector:a]; //Works Fine and the call is made - However Notice no parameter is passed . In this case what would the value of the parameter be in the method ?
这将是未定义的垃圾。您无法保证它可能包含的内容。最有可能的是,它将是一个无效的指针。如果您不幸,它可能是指向某个任意对象的有效指针,并且对其进行操作会破坏您应用的状态。如果你很幸运,它会崩溃,所以你可以找到问题。