object-c 类簇 category

来源:互联网 发布:淘宝助手官网 编辑:程序博客网 时间:2024/06/06 06:38

http://disanji.net/category/iphone-doc/  

 

 

Objective-C使用Category

CategoryCocoaiOSiOS入门Objective-c

Category是ObjC语言中的扩展机制之一,另一个为Protocol。

Category提供一种为某个类添加方法而又不必编写子类的途径。

假设有这样一个类CarInfo:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

    #import <Foundation/Foundation.h>

 

    @interface CarInfo : NSObject {

 

    }

 

    -(void)sayCarBrand;

 

    @end

 

    @implementation CarInfo

 

    -(void) sayCarBrand{

        NSLog(@"Car brand: Golf");

    }

 

    @end

我可以用Category为该类增加新的方法:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

    #import <Foundation/Foundation.h>

    #import "CarInfo.h"

 

    @interface CarInfo(CarInfoCategory)

 

    -(void)sayCarBrandChinese;

 

    @end

 

 

 

    @implementation CarInfo(CarInfoCategory)

 

    -(void)sayCarBrandChinese{

        NSLog(@"汽车品牌:高尔夫");

    }

 

    @end

这里的Category增加了一个新的方法,用来显示汉字名称。可在其他代码中直接调用,就如同调用CarInfo其他实例方法一样:

1

2

CarInfo *carInfo=[[CarInfo alloc] init];

[carInfo sayCarBrandChinese];

这种效果是Java做不到的。这得益于ObjC语言方法调度程序这一特殊机制。

如果方法名称相同会怎样?比如:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

        #import <Foundation/Foundation.h>

        #import "CarInfo.h"

 

        @interface CarInfo(CarInfoCategory)

 

        -(void)sayCarBrand;

 

        @end

 

        @implementation CarInfo(CarInfoCategory)

 

        -(void)sayCarBrand{

        NSLog(@"汽车品牌:高尔夫");

        }

 

        @end

再次调用:

1

2

CarInfo *carInfo=[[CarInfo alloc] init];

[carInfo sayCarBrand];

会发现,打印的是category中的方法,而不是类的实例方法。因为category优先于类实例方法。

那么是否有这样的能力,比如在category的方法内代码中调用类的实例方法,这样不就可以实现类似Java方法拦截器的功能了么?或者说是方法代理模式。遗憾的是,这样不可以。
原文链接:http://marshal.easymorse.com/archives/4183

转载编辑: Fgamers

转载地址:http://disanji.net/2011/05/17/objective-c-use-category/