2014-06-13 63 views
0

我有一個名爲MyImage的自定義類從UIImage繼承。現在我有一個UIImage對象,有什麼辦法將它轉換成MyImage對象嗎?Objective-c將父類轉換爲其派生類


更新

對不起不夠明確。

我無法使用類別,因爲我需要向我的課程添加新的屬性。

我想完成的是讓我的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,寬度和高度。由於我正在編寫即時消息應用程序,並且在收到新的圖像消息時,我只有它的網址,寬度和高度。然後我將它們分配給一個MyImage對象,並在後臺下載圖像。

現在給出一個原始的UIImage A,我想創建一個新的MyImage對象B,它指向與A相同的圖像,但未分配這些新屬性。然後我手動指定URL,寬度和高度B.

到@rmaddy,你能告訴我怎麼寫的方法

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

的一種方式,我可以想出是第一個UIImage對象轉換爲NSData的,然後使用

[MyImage imageWithData:] 

有沒有更好的辦法?

+0

你可以寫'myImage = [[MyImage alloc] initWithImage:uiImage];''。正如我在回答中所述,這需要在'MyImage'類中添加'initWithImage:'方法。 – rmaddy

+0

你的對象是'UIImage'或'MyImage'。它不可能是兩個;這會違反非矛盾法則。如果你解釋爲什麼你想要'UIImage'的子類,它可能會有所幫助。例如,如果你只是添加方法(像'downloadWithURL:'有點常見),你只需要這樣做,然後你可以在任何需要'UIImage'的類中使用'MyImage',因爲'MyImage'是一種'UIImage'。 –

+0

發佈您的'MyImage'類的更多細節。沒有任何細節,很難提供具體的答案。 – rmaddy

回答

0

我不一定建議這是一個解決方案,但確實有一種方法可以做到您正在尋找的東西。它被稱爲ISA Swizzling。可以把它看成是類似方法而不是方法的方法。

看看Objective-C的運行時的object_setClass[link]

我不會去到它(有更好的資源在那裏),但是這基本上是志願是如何工作的。無論如何,如果您更好地描述了UIImage子類的功能,以便我們可以幫助描述爲什麼rmaddy描述的自定義初始化程序可能是最佳解決方案,這將會很有幫助。

+1

如果'MyImage'需要比'UIImage'更多的內存,這將不起作用。 –

+0

是的,很多原因你不應該使用它。但是想把它作爲教育的替代品。 @downvoter,這是對所提問題的合理回答,爲什麼downvote? –

+0

我沒有downvote,我的意見是爲了擴大你的答案,而不是批評它。 –

0

MyImage類是子類UIImage,所以如果你正在創建一個新的實例,你需要正確初始化超類。 UIImage不提供從另一個UIImage實例那樣做的方法,但您可以使用CGImage,並且您可以從現有圖像中獲取其中一個。所以這樣做:

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