1

我有这个简单的 Shape 类:

形状.h

#import <Foundation/Foundation.h>

@interface Shape : NSObject

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

@end

和形状.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,对吧?

4

1 回答 1

2

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

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

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

在此处输入图像描述

您可以更改名称或添加显式转换:

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
于 2013-11-03T20:42:15.147 回答