客观C代码中的分段错误

时间:2013-10-15 17:01:30

标签: objective-c inheritance crash segmentation-fault

在子类[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];
}

1 个答案:

答案 0 :(得分:0)

如果你打电话

[Abc display];

如果要调用+display的{​​{1}}方法,则将Abc解析为类self

因此

Abc

已解析为

[self display]

导致无限循环。

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