iOS之類別(Category)、類擴充、繼承的區別

來源:互聯網
上載者:User

      iOS在2.0就已經推出類別(Category),它允許開發人員在不改動原有類的情況下,對該類進行擴充使用。我們知道,OC 和 Swift 都具備單繼承特性,也可以通過建立子類繼承父類的方式,實作類別的方法擴充。但兩者區別在哪裡呢。如果重寫一個類,是用類別好還是繼承好。


為了避免重複造輪子,直接援引結論吧:

以下情況,使用繼承: 1)新擴充的方法與原方法同名,但是還需要使用父類的實現。
2)擴充類的屬性

// ViewControllerEx.h@interfaceViewControllerEx : UIViewController// 自己需要添加的方法@end// ViewControllerEx.m@implementationViewControllerEx// 方法的實現@end
以下情況,使用類別: 1)針對系統特定類,例如: NSString,NSArray,NSNumber等。

2)針對自訂類,對於大型而複雜的類,為提高可維護性,把相關的方法分組到多個單獨的檔案中。

@interface 主類類名(分類類名)//不可以定義成員屬性@end@implementation 主類類名(分類類名)@end

// 這裡有一個約定俗成的規定,類別檔案命名時,是原類名+擴充標識名//  NSString+ex.h@interface NSString(ex)// 擴充的類回別方法@end//  NSString+ex.m@implementation NSString(ex)// 方法的實現@end


3)雖然不能在分類(類別)中定義成員屬性,但是有辦法也可以讓它支援添加屬性和成員變數  

    一種常見的辦法是通過runtime.h中objc_getAssociatedObject / objc_setAssociatedObject來訪問和產生關聯對象。通過這種方法來類比產生屬性。

“NSObject+SpecialName.h”檔案:@interface NSObject (SpecialName)@property (nonatomic, copy) NSString *specialName;@end
“NSObject+SpecialName.m”檔案:#import "NSObject+Extension.h"#import <objc/runtime.h>static const void*SpecialNameKey = &SpecialNameKey;    @implementation NSObject (SpecialName)@dynamic specialName;- (NSString *)specialName {    //如果屬性值是非id類型,可以通過屬性值先構造OC的id對象,再通過對象擷取非id類型屬性    return objc_getAssociatedObject(self, SpecialNameKey);}- (void)setSpecialName:(NSString *)specialName{    //如果屬性值是非id類型,可以通過屬性值先構造OC的id對象,再通過對象擷取非id類型屬性    objc_setAssociatedObject(self, SpecialNameKey, specialName, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } @end

4)注意事項 分類中方法的優先順序比原來類中的方法高,也就是說,在分類中重寫了原來類中的方法,那麼分類中的方法會覆蓋原來類中的方法 分類中只能聲明方法,不能添加屬性變數,在運行時分類中的方法與主類中的方法沒有區別 通常來講,分類定義在.h檔案中,但也可以定義.m檔案中,此時分類的方法就變成私人方法 什麼是類擴充(extensions)。點擊開啟連結




? // 這裡有一個約定俗成的規定,類別檔案命名時,是原類名+擴充標識名 //  NSString+ex.h @interface NSString (ex) // 擴充的類回別方法 @end //  NSString+ex.m @implementation NSString (ex) // 方法的實現 @end

參考:http://bluevt.org/?p=183

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.