2015-04-19 31 views
1

我想重寫UIColorisEqual:方法。我在類別方法中這樣做,但它似乎並沒有被調用,無論是從NSArraycontainsObject:,還是直接調用,如下所示。重寫UIColor的isEqual:類別內的方法

它已經作爲類別頭文件中的方法公開,我也檢查過該類別是否已導入到我正在處理的實現文件中。

當它被直接調用:

UIColor *col = [UIColor eightBitColorWithRed:pxl.red green:pxl.green blue:pxl.blue]; 
int index = -1; 
for (int i = 0; i < self.colorArrayM.count; i++) { 
    if ([col isEqual:((UIColor*)self.colorArrayM[i])]) { 
     index = i; 
     break; 
    } 
} 

和類別方法:

-(BOOL) isEqual:(id)otherColor { 
    if (otherColor == self) 
     return YES; 
    if (!otherColor || ![otherColor isKindOfClass:[self class]]) 
     return NO; 
    return [self isEqualToColor:otherColor]; 
} 

-(BOOL) isEqualToColor:(UIColor*)otherColor { 
    if (self == otherColor) 
     return YES; 

    unsigned char r0, r1, g0, g1, b0, b1; 
    [self eightBitRed:&r0 green:&g0 blue:&b0]; 
    [otherColor eightBitRed:&r1 green:&g1 blue:&b1]; 

    return r0 == r1 && g0 == g1 && b0 == b1; 
} 

回答

0

簡短的回答是,類別不打算重寫現有的方法:

儘管Objective-C語言目前允許您使用類別來覆蓋類繼承的方法,甚至是我在類接口中聲明的方法,你強烈建議不要這樣做。一個類別不能代替一個子類。但使用一個類別重寫方法的若干顯著的缺點:

  • 當類別覆蓋一個繼承 方法,在 類別中的方法可以像往常一樣,通過消息調用繼承 實施super 。 但是,如果類別覆蓋類別 類中存在的 方法,則無法調用原始實現。

  • 類別不能可靠地覆蓋在同一類的另一個類別中聲明的方法。

    這個問題特別重要,因爲許多Cocoa類都是使用類別實現的。您嘗試覆蓋的框架定義方法本身可能已在類別中實現,因此沒有定義哪個實現優先。

  • 某些類別方法的存在可能導致跨所有框架的行爲更改。例如,如果在NSObject的類別中覆蓋windowWillClose:委託方法,則程序中的所有窗口委託都會使用類別方法進行響應; NSWindow的所有實例的行爲可能會發生變化。您添加到框架類上的類別可能會導致行爲中的神祕變化並導致崩潰。

您將需要調配原isEqual:方法使用自己的實現。有一個偉大的NSHipster article on swizzling應該讓你開始。

+1

嘗試調整和它_seemed_切換實現,即'method_exchangeImplementations(originalMethod,swizzledMethod)'被調用,但是當調用顏色上的'isEqual:'時,沒有打印來自我的自定義方法的日誌,也沒有停止任何斷點...(不知道這種混合是否會搞砸?)。 我最終在NSArray上爲'containsColor:'和'indexOfColor:'添加了一個類別,它從我的UIColor類別中調用了我的自定義方法。 –