2015-02-22 | code

Objective-C 范畴

目录

实现类的一部分方法的模块叫范畴类别

1
2
3
4
5
6
7
8
9
10
11
//范畴的声明
@interface 类名 (范畴名)
//方法声明
//...
@end

//范畴的实现
@implementation 类名 (范畴名)
//方法定义
//...
@end

##范畴的文件组织

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//*1 范畴的接口部分必须引用住文件的接口文件
//*2 范畴的实现部分必须引用对应的接口文件
//*3 使用范畴中的方法时必须引用方法所在的头文件
//--------------------------------------

//Card.h
//--------------------------------------
#import <Foundation/NSObject.h>
@interface Card
{}
- (void) method;
@end

//Card.m
//--------------------------------------
@implementation Card
{}
- (void)method
{
//...
}
@end

//Card+Display.h
//--------------------------------------
#import "Card.h" //*1
@interface Card (Display)
- (void) methodDisplay;
@end

//Card+Display.m
//--------------------------------------
#import "Card+Display.h" //*2
@implementation Card (Display)
- (void) methodDisplay
{
//...
}
@end

//main.m
//--------------------------------------
#import <Foundation/Foundation.h>
#import "Card+Display.h" //*3

int main(int argc, const char * argv[]) {
Card *c = [[Card alloc] init];
[c methodDisplay];
}


##定义类内私有方法

可以单独定义一范畴容纳所有需要在类内共享的私有方法,
其他需要这些方法的范畴都引用这个范畴接口
就可以做到类内共享方法不对类外公开

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65

//Card.h
//-----------------------------------------
#import <Foundation/NSObject.h>

@interface Card
{}
- (void) method;
@end

//Card.m
//-----------------------------------------
#import "Card.h"
@implementation Card
{}
- (void)method
{
//...
}
@end

//Card+Local.h
//-----------------------------------------
//类内共享私有方法

#import "Card.h"

//++++++++++++++++++++
//在这声明私有的公用变量
//++++++++++++++++++++

@interface Card (Local)
//++++++++++++++++++++
//声明私有方法
//++++++++++++++++++++
@end

//Card+Local.m
//-----------------------------------------
#import "Card+Local.h"
//定义公用变量
@implementation Card (Local)
//实现方法
@end


//Card+Display.h
//-----------------------------------------
#import "Card.h"
#import "Card+Local.h"

@interface Card (Display)
- (void) methodDisplay;
@end

//Card+Display.m
//-----------------------------------------
#import "Card+Display.h"
@implementation Card (Display)
- (void) methodDisplay
{
//...
}
@end


##类扩展

为防止忘记引用私有方法头文件 引入类扩展的概念.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//类扩展定义
//与范畴类似 只是()内没有文本

//类名.h
@interface 类名 ()
{
//...
}
//...
@end

//类名+(随意).h
@interface 类名 ()
{
//可以增加实例变量
}
//...
@end

###示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76

//Card.h
//-----------------------------------------

#import <Foundation/NSObject.h>

@interface Card
{

}
- (void) method;
@end


//Card+Local.h
//-----------------------------------------
//类扩展

#import "Card.h"

@interface Card ()
{
//++++++++++++++++++++
//在这声明私有的公用变量
//++++++++++++++++++++
}
//++++++++++++++++++++
//声明私有方法
//++++++++++++++++++++
@end

//Card.m
//-----------------------------------------

#import "Card.h"
#import "Card+Local.h"

@implementation Card
{
//定义非公开的实例变量
}
//实现方法
//实现类扩展中的私有方法
@end

//类扩展中不需要
//Card+Local.m
//-----------------------------------------
// #import "Card+Local.h"
// //定义公用变量
// @implementation Card ()
// {
//
// }
// //实现方法
// @end


//Card+Display.h
//-----------------------------------------
#import "Card.h"

@interface Card (Display)
- (void) methodDisplay;
@end

//Card+Display.m
//-----------------------------------------
#import "Card+Display.h"
@implementation Card (Display)
- (void) methodDisplay
{
//...
}
@end


##注意事项

  • 定义新范畴中如果有和原类中重名方法,新方法会覆盖老方法

  • 范畴不能声明实例变量,只能声明方法(类方法/实例方法都可)

  • 范畴接口中可以包含属性声明,但是范畴实现中不可以使用
    @synthesize

  • 类扩展也可以包含属性声明,可通过在类的实现部分包含
    @synthesize 或者属性方法来实现 类扩展可以声明实例变量的属性