当我在SubClass中使用方法[super performSelector:@selector(aMethod)]
时,我遇到了无限循环问题,详情如下:
我有一个BaseClass
@interface BaseClass : NSObject
//- (void) aMethod:(NSString *) aString;
@end
@implementation Parent
- (void) aMethod:(NSString *) aString
{
NSLog(@"Base");
}
@end
和SubClass
@interface SubClass :BaseClass
- (void) aMethod:(NSString *) aString;
@end
@implementation Parent
- (void) aMethod:(NSString *) aString
{
[super performSelector:@selector(aMethod:) withObject:nil];
NSLog(@"Sub");
}
@end
当我发送subClass
SubClass
消息[subClass aMethod]
的实例时,有一个无限循环问题,即调用[subClass aMethod:]
& [super performSelector:]
或者。{/ p>
有谁可以告诉我为什么会这样?
我只知道[super performSelector:]
将使用objc_msgSendSuper
发送消息,但为什么这个调用导致无限循环问题会让我发疯。
答案 0 :(得分:3)
您应该使用objc_msgSendSuper()
代替[super performSelector:]
。
修改:为了澄清,performSelector:
方法实际上已在NSObject
中实施,因此如果您在{{1}上调用它并不重要}或self
,实现转到super
的重写实现。
aMethod
最佳选择是在您的子类.m文件中添加类扩展。现在您的子类知道该方法,您可以调用@interface BaseClass ()
- (void) aMethod:(NSString *) aString;
@end
。
答案 1 :(得分:1)
Subclass
被声明为NSObject
的子类,但未实现aMethod
。另外,两个@implementation
指令都引用Parent
,就我所见,这是未定义的。
答案 2 :(得分:1)
我想我假设你的帖子中有一个拼写错误,并且有2个类,BaseClass和SubClass,以及Subclass子类BaseClass。
除非你在SubClass中覆盖performSelector,否则[super performWithSelector:]在功能上等同于调用[self performWithSelector:]。
在这种情况下,你应该改为调用[super aMethod]。
答案 3 :(得分:0)
您的问题是,您正在super
调用-performSelector:withObject:
,而不是您传入的方法。由于我假设您的任何对象都没有实现-performSelector:withObject:
该调用一直到达NSObject实现,与您在super
或self
上的实现相同。
我希望您尝试做的是致电[super aMethod:anObject];
。如果您尝试使用变量选择器,则必须使用Objective C运行时,但我强烈建议您重新检查目标。在iOS开发的5年中,我从来没有必要这样做。