Objective-c将父类转换为其派生类

时间:2014-06-13 19:22:26

标签: objective-c

我有一个名为MyImage的自定义类继承自UIImage。现在我有一个UIImage对象,有没有办法将它转换为MyImage对象?


更新

很抱歉不清楚。

我无法使用类别,因为我需要向我的班级添加新属性。

我想要完成的是让我的MyImage对象指向原始的UIImage对象。


更新2

我试过这样的事情:

- (MyImage*)initWithUIImage:(UIImage *)image {
    if (self = [super init]) {
        self = image;
    }
    return self;
}

显然它不起作用。

另外,由于UIImage没有名为'initWithImage:(UIImage *)'的方法,我不能写像

myImage = [[MyImage alloc] initWithImage:uiImage];

我也试过

self = [image copy]

但是返回值仍然是UIImage对象,而不是MyImage对象。


更新3

在MyImage中,我需要添加3个属性:url,width和height。由于我正在编写即时消息应用程序,并且在收到新的图像消息时,我只有其网址,宽度和高度。然后我将它们分配给MyImage对象,并在后台下载图像。

现在给出一个原始的UIImage A,我想创建一个新的MyImage对象B,它指向与A相同的图像,但是这些新属性未分配。然后我手动将URL,宽度和高度分配给B。

到@rmaddy,你能告诉我如何编写方法

[[MyImage alloc] initWithImage:(UIImage*)]

我可以提出的一种方法是首先将UIImage对象转换为NSData,然后使用

[MyImage imageWithData:]

有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

我不一定建议将其作为解决方案,但确实有办法完全按照您的要求进行操作。它被称为ISA Swizzling。可以把它想象为方法调配,但是对于类而不是方法。

看看Objective-C运行时object_setClass [link]

我不会进入它(有更好的资源),但这实际上是KVO的工作方式。无论如何,如果您更好地描述UIImage子类的功能将会有所帮助,以便我们可以帮助描述为什么rmaddy描述的自定义初始化程序可能是最佳解决方案。

答案 1 :(得分:0)

您的MyImage类是UIImage子类,因此,如果您要创建新实例,则还需要正确初始化超类。 UIImage没有提供从另一个UIImage实例执行此操作的方法,但您可以使用CGImage,并且可以从现有图像中获取其中一个。{1}}。所以这样做:

- (MyImage*)initWithUIImage:(UIImage *)image {
    if (self = [super initWithCGImage:image.CGImage]) {
        // put any necessary MyImage-specific stuff here
    }
    return self;
}