为什么我会得到“不兼容的指针类型”?

时间:2011-03-21 19:29:13

标签: objective-c compiler-errors foundation

我正在尝试创建一个自定义对象,它只是继承NSString类并覆盖'description'方法。

然而,当我编译时,我收到警告:

  

不兼容的指针类型初始化'OverrideTester *',表达式为'NSString *'

这是我的代码:

的main.m

#import <Foundation/NSObject.h>
#import <Foundation/NSString.h>
#import <Foundation/NSAutoreleasePool.h>
#import "OverrideTester.h"

int main (int argc, char *argv[])
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    NSString *str = @"Programming is fun";
    OverrideTester *strOverride = @"Overriding is fun";

    NSLog (@"%@", str);
    NSLog (@"%@", strOverride);

    [pool drain];
    return 0;
}

OverrideTester.h

#import <Foundation/Foundation.h>

@interface OverrideTester : NSString
-(void) description;
@end

OverrideTester.m

#import "OverrideTester.h"

@implementation OverrideTester

-(void) description

{
    NSLog(@"DESCRIPTION!\n");
}

@end

3 个答案:

答案 0 :(得分:5)

NSString是类集群的一部分。您不能只创建它的任意子类,当您这样做时,您不能为它们分配常量字符串(类型为NXConstantString)。请参阅NSString文档中的Subclassing Notes。通常,您不希望子类NSString。对于大多数问题,有更好的解决方案。

答案 1 :(得分:2)

  1. 您正在为NSString类型的变量分配OverrideTester的实例。如果您想要类的实例,则需要实例化该类的实例;类型转换永远不会更改实例的类。

  2. description定义为返回NSString*

    - (NSString *)description;

  3. 尝试通过继承NSString(或任何其他类集群)来了解子类化和重写方法。如果你想使用子类化等 - 当一个新的语言时,一个非常好的主意 - 当然 - 然后继承NSObject,可能是多个级别,然后在那里玩。


  4.   

    你是如何将NSObject子类化的,   可能是多个级别?不是吗   NSObject可能有   冲突的方法与其他方法相比   类集群或只是没有它们   可以覆盖?

    如果您的目标是弄清楚方法覆盖是如何工作的(我认为是这样),那么您最好完全自己完成。

    我可能误读了你的问题。

    无论如何,子类化NSString几乎从未完成。极少数情况下它很有用。除了专门用于调试目的的自定义类之外,覆盖description是有用的,是的。不应该在生产代码中调用description

      

    另外,为什么描述会返回   这段代码中的NSString *?

    如果需要NSString*返回值的内容是调用不返回任何内容的版本,会发生什么?

    崩溃。

答案 2 :(得分:0)

您正在声明一个名为strOverride的变量,其类型指针指向OverrideTester。但是对于该变量,您尝试分配指向NSString的指针。您不能将超类分配给子类的变量。想象一下通用类TwoWheeled和派生类MotorbikeMotorbike可以被视为TwoWheeled,但不能相反,因为Motorbike具有正常TwoWheeled可能没有电机的功能。