2011-04-20 63 views
3

我想要繼承UIColor,我似乎無法弄清楚什麼是錯的。不能繼承UIColor?

在我PColor.h

#import <Foundation/Foundation.h> 
@interface PColor : UIColor { 
    BOOL isAvailable; 
    int colorId; 
} 
@property (nonatomic, assign) BOOL isAvailable; 
@property (nonatomic, assign) int colorId; 
@end 

...在我PColor.m

#import "PColor.h" 

@implementation PColor 
@synthesize isAvailable; 
@synthesize colorId; 
@end 

在實例化一個令pColor對象,我得到:

//warning: incompatible Objective-C types initializing 'struct UIColor *', expected 'struct PColor *' 
PColor *pcolor = [[PColor alloc] initWithHue:1 saturation:0 brightness:0 alpha:1]; 

上午我遺漏了什麼?提前致謝。

回答

6

UIColor類集羣使用associative references在一個類別添加屬性! UIColor上的所有自定義初始化方法都會返回UIColor*而不是id,因此您無法輕易子類UIColor,也不應該嘗試。

的UIColor + PCOLOR.h

#import <UIKit/UIKit.h> 
#import <objc/runtime.h> 

@interface UIColor(PCOLOR) 
//Properties prefixed to try and avoid future conflicts 
@property (nonatomic, assign) BOOL pIsAvailable; 
@property (nonatomic, assign) int pColorId; 
@end 

的UIColor + PCOLOR.h

#import "UIColor+PCOLOR.h" 

@implementation UIColor(PCOLOR) 

static char PCOLOR_ISAVAILABLE_KEY; 
static char PCOLOR_COLORID_KEY; 

@dynamic pIsAvailable, pColorId; 

-(void)setPIsAvailable:(BOOL)pIsAvailable 
{ 
    objc_setAssociatedObject(self, &PCOLOR_ISAVAILABLE_KEY, [NSNumber numberWithBool:pIsAvailable], OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 

-(BOOL)pIsAvailable 
{ 
    return [(NSNumber*)objc_getAssociatedObject(self, &PCOLOR_ISAVAILABLE_KEY) boolValue]; 
} 

-(void)setPColorId:(int)pColorId 
{ 
    objc_setAssociatedObject(self, &PCOLOR_COLORID_KEY, [NSNumber numberWithInt:pColorId], OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 

-(int)pColorId 
{ 
    return [(NSNumber*)objc_getAssociatedObject(self, &PCOLOR_COLORID_KEY) intValue]; 
} 

@end 

USAGE

UIColor *pcolor = [[UIColor alloc] initWithHue:1 saturation:0 brightness:0 alpha:1]; 
pcolor.pColorId = 2352; 
pcolor.pIsAvailable = YES; 
NSLog(@"\nClass: %@\nColor ID: %d\nIs Availabled: %@", 
     NSStringFromClass([pcolor class]), 
     pcolor.pColorId, 
     pcolor.pIsAvailable ? @"YES" : @"NO"); 
[pcolor release]; 
+0

這是一個非常徹底的答案......謝謝喬。關聯參考=真棒。 – Chazbot 2011-04-22 23:05:06

+0

不錯的答案一起來...一個dout爲什麼OBJC_ASSOCIATION_RETAIN_NONATOMIC爲Bool值OBJC_ASSOCIATION_ASSIGN足夠了......? – ShivaPrasad 2012-04-11 06:41:26

+0

@jeeva如果你看,你只能將'objects'作爲關聯對象存儲,所以'BOOL'需要被包裝成'NSNumber',然後需要保留。 – Joe 2012-04-11 12:59:10

1

因爲UIColor alloc可能不會做你期望的操作:分配一個UIColor實例。它可能是一種工廠方法,它首先查看哪些顏色已被使用或屬於一組標準顏色,然後將其返回而不是創建新實例。在這種情況下,您將獲得UIColor而不是PColors,並且意味着繼承UIColor不是一個好主意。

比繼承更喜歡構圖 - 將UIColor嵌入到PColor中。或者在UIColor上使用一個類別(在這種情況下,你不能有新的實例變量)。

5

UIColor Class Reference

大多數開發人員應該沒有需要繼承的UIColor。如果您需要支持其他顏色空間或顏色模型,則唯一需要這樣做的可能是必要的。

您應該使用類別。例如:

@interface UIColor (PColor) 
    - (BOOL) isAvailable; 
    - (int) colorId; 
@end 

在實現文件:

@implementation UIColor (PColor) 

    - (BOOL)isAvailable { 
     // do what you want to do 
     // return your BOOL 
    } 

    - (int)colorId { 
     // do what you want to do 
     // return id of color 
    } 

@end 
+1

同意。我認爲一個類別更合適,Black Frog的例子可以滿足您的需求。 – 2011-04-20 14:01:47

+0

非常感謝所有的答覆傢伙 - 周圍的偉大信息。 – Chazbot 2011-04-22 04:14:38

+0

對不起黑蛙,但我必須把這一個給喬在聯合參考上的位。儘管如此,萬分感謝。 – Chazbot 2011-04-22 23:33:06

0

初始化的UIColor方法返回的UIColor *,而不是id的大多數類,所以你必須把它分配給的UIColor相當比你的子類避免警告。