2014-05-20 31 views
1

問題

如果objective-c中的某個類別不影響我的程序,如果它不被導入到任何地方,這怎麼可能?它僅僅存在於一個文件中正在改變程序的結果。如果在Objective-C中未導入類別時它將如何運行?

軼事

我的UISearchBar破壞從iOS 7.1開始。一個同伴StackOverflow成員建議我的一個類別可能有overridden a function在iOS 7.1中引入UISearchBar。他的懷疑是對的。我通過慢慢評論我的UISearchBar類別的所有進口來測試他的理論。在評論最後一個類別之後,我的搜索欄仍然被打破。在絕望的行爲中,我逐個刪除了我的UISearchBar類別文件。我發現在刪除以下文件後,我的搜索欄再次開始工作。

#import "UISearchBar+CustomUI.h" 

@implementation UISearchBar (CustomUI) 

- (UITextField*)searchField 
{ 
    UITextField *searchField = nil; 
    for (UIView *subview in self.subviews) { 
     if ([subview isKindOfClass:[UITextField class]]) { 
      searchField = (UITextField *)subview; 
      break; 
     } 
    } 
    return searchField; 
} 

@end 

是的,我知道上面是脆弱的代碼,但有非常規的設計要求,迫使程序員破解。

+0

這就是爲什麼經常不推薦用類別覆蓋方法的原因。類別甚至可以影響Apple的私有API! – CrimsonChris

回答

1

即使您尚未導入類別,它可能已編譯到二進制文件中。查看Build Phases中的Compile Sources,你應該在那裏看到你的類別,或者在File Inspector下看到Target Membership。有效的類別將在運行時加載,因此方法將被覆蓋。需要導入才能暴露這些方法,以便您可以在沒有編譯器警告您的情況下使用它們。

+0

是的,我所有的類別都在「編譯源」中。令我困惑的是,如果你不導入它,你就不能使用類別內的函數。但即使您不導入它,該功能也可以在碰撞時使用。 – Pwner

+0

那麼,關於「你不能使用函數」的解釋問題,試試這個'[yourInstance performSelector:NSSelectorFromString(@「yourCategoryMethod」)]''。順便說一下,我不建議你這樣做,它只是爲了測試。這將起作用,因爲類別已加載,因此實例將響應類別中的選擇器。 – lucianomarisi

相關問題