日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Category

發(fā)布時間:2023/12/18 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Category 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

無論一個類設(shè)計的如何完美,都不可避免的會遇到?jīng)]有預(yù)測到的需求,那怎么擴(kuò)展現(xiàn)有的類呢?當(dāng)然,繼承是個不錯的選擇。但是Objective-C提供了一種特別的方式來擴(kuò)展類,叫Catagory,可以動態(tài)的為已經(jīng)存在的類添加新的行為。這樣可以保證類的原原來的基礎(chǔ)上,較小的改動就可以增加需要的功能。使用Category對類進(jìn)行擴(kuò)展時,不需要訪問其源代碼,也不需要創(chuàng)建子類,這樣我們可以擴(kuò)展系統(tǒng)提供的類。Category使用簡單的方式,實現(xiàn)了類的相關(guān)方法的模塊化,把不同的類方法分配到不同的分類文件中。

通過一個簡單的例子看看Category如何使用。

現(xiàn)在我們有一個類叫MyClass

  • #import?<Foundation/Foundation.h>??
  • ??
  • @interface?MyClass?:?NSObject??
  • -(void)?myPrint;??
  • @end ?
  • #import?"MyClass.h"??
  • ??
  • @implementation?MyClass??
  • -(void)?myPrint{??
  • ????NSLog(@"myPrint?調(diào)用了");??
  • }??
  • @end??
  • 它有一個實例方法:myPrint,待會我們可以在擴(kuò)展后調(diào)用它

    ?

    好了,有了上面的MyClass后,我們要在不增加子類,不修改MyClass類的情況下增加一個HelloWorld的方法,怎么添加呢?只需添加兩個文件MyClass+HelloWorld.h ?和?MyClass+HelloWorld.m。

    在聲明文件和實現(xiàn)文件中用“()”把Category的名稱括起來。原類名+Category”的這是約定的文件命名方式。

    看看這兩個文件怎么實現(xiàn),在Xcoed上按Command+N,新建文件,選擇Objective-C category方式創(chuàng)建類,這樣Xcode會自動幫你創(chuàng)建約定命名方式的文件。
    Category on的類是MyClass,選對了哦

    這樣Xcode就幫你創(chuàng)建了MyClass+HelloWorld.h ?和?MyClass+HelloWorld.m這兩個文件了。

    那么我們現(xiàn)在添加一個HelloWorld方法。看看實現(xiàn)后的代碼如下:

    ?

  • #import?"MyClass.h"??
  • ??
  • @interface?MyClass?(HelloWorld)??
  • -(void)HelloWorld;??
  • @end ?
  • #import?"MyClass+HelloWorld.h"??
  • ??
  • @implementation?MyClass?(HelloWorld)??
  • -(void)HelloWorld{??
  • ????NSLog(@"你好?倫敦奧運!");??
  • }??
  • @end??
  • 在main中調(diào)用

    ?

    ?

  • MyClass?*myclass?=?[[[MyClass?alloc]init]autorelease];??
  • [myclass?HelloWorld];??
  • [myclass?myPrint];??
  • ?

    運行打印結(jié)果:

    ?

  • 2012-08-09?11:24:16.697?objectiveC[16053:403]?你好?倫敦奧運!??
  • 2012-08-09?11:24:16.699?objectiveC[16053:403]?myPrint?調(diào)用了??
  • ?

    ?

    那的Category的使用場景有那些呢:
    1、類包含了很多個方法實現(xiàn),而這些方法需要不同團(tuán)隊的成員來實現(xiàn)
    2、當(dāng)你在使用基礎(chǔ)類庫中的類時,你不想繼承這些類而只想添加一些方法時。
    ?
    Category能實現(xiàn)上面的需求,當(dāng)然也有使用Category是需要注意的問題:
    1、Category可以訪問原始類的實例變量,但不能添加實例變量,如果想添加變量,那就通過繼承創(chuàng)建子類來實現(xiàn)。
    2、Category可以重載原始類的方法,不大不推薦這么做,這樣會覆蓋掉原始類的方法。如果確實要重載,那就通過繼承創(chuàng)建子類來實現(xiàn)。
    3、和普通接口有所區(qū)別的是,在Category的實現(xiàn)文件中的實例方法只要你不去調(diào)用它你可以不用實現(xiàn)所有聲明的所有方法。


    1. 擴(kuò)展類的功能

    Category提供了一種比繼承(inheritance)更為簡潔的方法來對class進(jìn)行擴(kuò)展,我們可以為任何已經(jīng)存在的class添加方法(不包括數(shù)據(jù)成員)卻不需要訪問該class的實現(xiàn)文件。
    新添加的方法和原有的方法具有同等的地位,可以訪問class的數(shù)據(jù)成員,并且完全植入到class的繼承體系之中,子類同樣會繼承新添加的方法。 利用category對類進(jìn)行擴(kuò)展可以避免使類的繼承體系過于臃腫,復(fù)雜,降低了維護(hù)成本。另外,新添加的方法如果和已經(jīng)存在的方法具有相同的 prototype,那么新添加的方法將會覆蓋已經(jīng)存在的方法,也就是category使得使得在沒有源文件時修改已存在class的 functionality或者清除bug成為可能,所有該class的對象的行為都將發(fā)生變化,這一點是繼承無法達(dá)到的。

    可以在以下情況使用Category

    • 當(dāng)你在定義類的時候,在某些情況下(例如需求變更),你可能想要為其中的某個或幾個類中添加方法。
    • 一個類中包含了許多不同的方法需要實現(xiàn),而這些方法需要不同團(tuán)隊的成員實現(xiàn) (有點意思,不知實踐中效果如何)
    • 當(dāng)你在使用基礎(chǔ)類庫中的類時,你可能希望這些類實現(xiàn)一些你需要的方法。

    ?

    使用方法:“原類名+Category”的方式命名,例子如下:

    (1)定義與實現(xiàn)

    NSString+Background.h?(給NaviationBar新添加的一個Category)

    #import <UIKit/UIKit.h>@interface UINavigationBar (Background) - (void)setNavgationBarBg; @end

    ?

    NSString+Background.m

    #import "UINavigationBar+Background.h"@implementation UINavigationBar (Background)- (void)setNavgationBarBg {UIImage * TitleBarImage = [UIImage imageNamed:@"Navigationbar_bg.png"];if([self respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]){[self setBackgroundImage:TitleBarImage forBarMetrics:UIBarMetricsDefault];} } @end

    ?

    (2)調(diào)用

    #import?NSString+Background.h

    2. 模擬私有方法/函數(shù)

    在.m中,實現(xiàn)私有方法。

    Foo.m

    #impot Foo.h@interface Foo (private) - (void) testPrivate; @end@implementation Foo- (void) test {[self testPrivate]; }- (void) testPrivate {NSLog(@"testPrivate Executed"); }@end

    ?

    3.缺點

    • Category可以訪問原始類的實例變量,但不能添加變量,如果想添加變量,可以考慮通過繼承創(chuàng)建子類。
    • Category可以重載原始類的方法,但不推薦這么做,這么做的后果是你再也不能訪問原來的方法。如果確實要重載,正確的選擇是創(chuàng)建子類
    • 名稱沖突,即當(dāng)類別中的方法與原始類方法名稱沖突時,類別具有更高的優(yōu)先級。類別方法將完全取代初始方法從而無法再使用初始方法。

    總結(jié)

    以上是生活随笔為你收集整理的Category的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。