0

在子类方法中添加[self display]消息后,+display我得到一个分段错误。我不明白为什么。在说代码应该无限循环之前请分析整个代码。添加上述消息之前的输出是:

2013-10-15 22:24:30.978 Polymorphism2[657:707] <A1: 0x7fd038c09d00>
2013-10-15 22:24:30.981 Polymorphism2[657:707] <A1: 0x7fd038c09d00>
2013-10-15 22:24:30.981 Polymorphism2[657:707] 10 
2013-10-15 22:24:30.982 Polymorphism2[657:707] 60  
2013-10-15 22:24:30.982 Polymorphism2[657:707] I'm not multiplying this right now 
2013-10-15 22:24:30.983 Polymorphism2[657:707] Superclass!!

还行吧。但是在添加上述消息之后[self display],它应该在行前多输出"Superclass!!"一行。它应该是

2013-10-15 22:24:30.983 Polymorphism2[657:707] Subclass!!. 

这是超类的代码

@interface Abc: NSObject 

- (void)calculate:(int)x;
- (void)calculate2:(int)x;
+ (void)display;

@end

@implementation Abc

- (void)calculate:(int)x{
    NSLog(@"%@",self);
    NSLog(@"%d",x);
    [self calculate:x];
    [self calculate2:x];
}

- (void)calculate2:(int)x{
    NSLog(@"%d",x*10);
}

+ (void)display{
    [self display];
    NSLog(@"Superclass!!");
}

@end

和子类

@implementation A1

- (void)start{
    NSLog(@"%@",self);

    [super calculate:10]; 
}

- (void)calculate:(int)x{ 
    NSLog(@"%d",x+50);
}

- (void)calculate2:(int)x{// Overriding
    NSLog(@"I'm not multiplying this right now");
}

+ (void)display{
    NSLog(@"Subclass");
}

- (void)callClassMethod{
    [Abc display];
}

@end

最后,主要

int main(){
    A1 *obj= [[A1 alloc] init]; //Subclass object
    [obj start];
    [obj callClassMethod];
}
4

1 回答 1

0

如果你打电话

[Abc display];

if 将调用 的+display方法Abc,其中上下文self被解析为类Abc

所以

[self display]

被解析为

[Abc display]

导致无限循环。

换句话说,如果您调用[Abc display],则没有理由假设self被解析为子类,例如A1.

于 2013-10-15T17:22:07.730 回答