使用[super peformSelector:]方法时的无限循环

时间:2013-11-21 17:20:03

标签: ios iphone

当我在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发送消息,但为什么这个调用导致无限循环问题会让我发疯。

4 个答案:

答案 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实现,与您在superself上的实现相同。

我希望您尝试做的是致电[super aMethod:anObject];。如果您尝试使用变量选择器,则必须使用Objective C运行时,但我强烈建议您重新检查目标。在iOS开发的5年中,我从来没有必要这样做。