如何摆脱“不兼容的指针类型”警告?

时间:2013-11-03 19:55:23

标签: objective-c constructor initialization

我有这个简单的Shape类:

Shape.h

#import <Foundation/Foundation.h>

@interface Shape : NSObject

-(id)initWithColor:(UIColor *)color;
+(instancetype)shapeWithColor:(UIColor *)color;

@end

和Shape.m

#import "Shape.h"

@interface Shape ()

@property (nonatomic, strong) UIColor *color;

@end


@implementation Shape

-(id)init
{
    return [self initWithColor:[UIColor whiteColor]];
}

-(id)initWithColor:(UIColor *)color
{
    self = [super init];

    if (self)
    {
        _color = color;
    }

    return self;
}

+(instancetype)shapeWithColor:(UIColor *)color
{
    return [[self alloc] initWithColor:color]; // I get the warning here
}

@end

在便捷构造函数的return语句中,我收到以下警告:

  

不兼容的指针类型将'UIColor *'发送到类型的参数   'CIColor *'

我在这里做错了什么?我知道我可以写return [[Shape alloc] initWithColor:color];但是在这种情况下,如果我使用Shape代替self,我会给我的子类带来问题,对吗?

1 个答案:

答案 0 :(得分:2)

编译器很困惑,因为initWithColor:也是CIImage的方法,定义为

- (id)initWithColor:(CIColor *)color;

您可以通过cmd单击方法名称轻松验证这一点。您将获得以下下拉列表,表示存在与该名称匹配的多个声明

enter image description here

您可以更改名称或添加显式广播:

return [(Shape *)[self alloc] initWithColor:color];

强制转换将为编译器提供足够的信息以正确地键入检查方法参数,并且不会影响子类化的可能性。

为了进一步阐明最后一个概念,我想强调一下,不会在运行时更改对象类型。这只是一个编译器提示。

return [[Shape alloc] init];         // always  returns an object of type Shape
return (Shape *)[[self alloc] init]; // the actual type depends on what self is,
                                     // but the compiler will typecheck against
                                     // Shape