分类
分类的基本概念:
分类时OC中新的语法。分类可以在不创建子类的情况下给已存在的类添加方法。在很多情况下分类是比创建子类更优的选择,分类添加的方法会自动被子类继承。分类可以添加新的方法却不能添加新的变量。
分类一般在多人开发同一个类时被使用,分类可以将同一个类可以根据用途放在不同源文件中,从而使得每个人独立开发相应的方法集合。
分类也会在给相关的方法分组时使用。
分类的用法:
1.给一个类添加新的方法
定义一个class类
#import <Foundation/Foundation.h>
@interface class : NSObject
- (void)method1;
@end
#import "class.h"
@implementation class
- (void)method1{
NSLog(@"method1");
}
@end
创建一个分类,添加一个新的方法
#import "class.h"
@implementation class
- (void)method1{
NSLog(@"method1");
}
@end
#import "class+category.h"
@implementation class (category)
- (void)method2{
NSLog(@"method2");
}
@end
测试结果
#import <Foundation/Foundation.h>
#import "class+category.h"
#import "class.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
class *class1 = [[class alloc]init];
//原有方法
[class1 method1];
//新添加的方法
[class1 method2];
}
return 0;
}
结果输出:method1 method2
2给类的方法分类(也叫延展)
例如根据功能给方法分类
#import <Foundation/Foundation.h>
@interface class2 : NSObject
- (void)method1;
@end
@interface class2 (m1)
- (void)method2;
@end
@interface class2 (m2)
- (void)method3;
@end
方法实现
#import "class2.h"
@implementation class2
- (void)method1{
NSLog(@"method1");
}
//第一类分组实现
- (void)method2{
NSLog(@"method2");
}
//第二类分组实现
- (void)method3{
NSLog(@"method3");
}
@end
协议
协议只有方法的声明,遵行协议的类可以根据自己的需求来实现方法。这样接口的声明和定义分开做,程序的耦合性更低。协议的关键字是@protocol
协议的用法
定义一个协议,并定义一个类来实现协议。我们定义一个usb协议。协议中有两个方法,分别用于读和写。
#import <Foundation/Foundation.h>
@protocol usb <NSObject>
- (void)read;
- (void)write;
@end
定义一个移动设备mobile类遵行该协议,并实现协议方法。
#import <Foundation/Foundation.h>
#import "usb.h"
@interface mobile : NSObject<usb>
@end
#import "mobile.h"
@implementation mobile
- (void)read{
NSLog(@"读取数据");
}
- (void)write{
NSLog(@"写入数据");
}
@end
代理
代理是一种设计模式,代理可以通过协议来实现对象之间的通信。
例如:在一个电脑的厂家一般都有自己的代理商。我们创建一个电脑的厂家类(以IBM为例),并声明他的代理方法。
#import <Foundation/Foundation.h>
@protocol ibmDelegate <NSObject>
- (void)sale;
@end
@interface ibm : NSObject
//一般把代理的属性设置为weak防止循环引用
@property (nonatomic,weak) id<ibmDelegate> delegate;
- (void)produce;
@end
#import "ibm.h"
@implementation ibm
- (void)produce{
NSLog(@"生产电脑");
}
@end
定义coo是ibm的代理,遵行代理,实现ibm的代理方法
#import <Foundation/Foundation.h>
#import "ibm.h"
@interface coo : NSObject<ibmDelegate>
@end
#import "coo.h"
@implementation coo
- (void)sale{
NSLog(@"销售电脑");
}
@end
测试
#import <Foundation/Foundation.h>
#import "coo.h"
#import "ibm.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
coo *c1 = [[coo alloc]init];
ibm *i1 = [[ibm alloc]init];
[i1 produce];
//设置代理
i1.delegate = c1;
[c1 sale];
}
return 0;
}
上述代理模式设计实现了IBM生产和销售代理部分的代码分开,降低了程序之间的耦合性。
注:本文参考了《ios应用开发详解》 郭宏志 编注 电子工业出版社