目录
实现类的一部分方法的模块叫范畴或类别
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
|
#import <Foundation/NSObject.h> @interface Card {} - (void) method; @end
@implementation Card {} - (void)method { } @end
#import "Card.h" @interface Card (Display) - (void) methodDisplay; @end
#import "Card+Display.h" @implementation Card (Display) - (void) methodDisplay { } @end
#import <Foundation/Foundation.h> #import "Card+Display.h"
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
|
#import <Foundation/NSObject.h>
@interface Card {} - (void) method; @end
#import "Card.h" @implementation Card {} - (void)method { } @end
#import "Card.h"
@interface Card (Local)
@end
#import "Card+Local.h"
@implementation Card (Local)
@end
#import "Card.h" #import "Card+Local.h"
@interface Card (Display) - (void) methodDisplay; @end
#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
|
@interface 类名 () {
}
@end
@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
|
#import <Foundation/NSObject.h>
@interface Card {
} - (void) method; @end
#import "Card.h"
@interface Card () {
}
@end
#import "Card.h" #import "Card+Local.h"
@implementation Card { }
@end
#import "Card.h"
@interface Card (Display) - (void) methodDisplay; @end
#import "Card+Display.h" @implementation Card (Display) - (void) methodDisplay { } @end
|
##注意事项
定义新范畴中如果有和原类中重名方法,新方法会覆盖老方法
范畴不能声明实例变量,只能声明方法(类方法/实例方法都可)
范畴接口中可以包含属性声明,但是范畴实现中不可以使用
@synthesize
类扩展也可以包含属性声明,可通过在类的实现部分包含
@synthesize
或者属性方法来实现 类扩展可以声明实例变量的属性