iOS开发之 类目,延展,协议

来源:互联网 发布:淘宝评语怎么删除 编辑:程序博客网 时间:2024/06/05 18:19

一,类目

类目就是为已存在的类添加新的方法。但是不能添加实例变量。比如系统的类,我们看不到他的.m文件,所以没有办法用直接添加方法的方式去实现。

类目的声明, 实现, 应用 代码如下

/* *类目的声明 *为NSMutableArray类添加Sort方法,Sort就是类目名,做到见名知意 */@interface NSMutableArray (Sort)//方法- (void)invert;@end/* *类目的实现 */@implementation NSMutableArray (Sort)- (void)invert {    NSUInteger count = self.count;    for (int i = 0; i<count/2; i++)    {        [self exchangeObjectAtIndex:i withObjectAtIndex:count-i-1];//第一个对象和最后一个对象交换    }}@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];    NSMutableArray * arr = [[NSMutableArray alloc]initWithObjects:@"12",@"4",@"89",@"88",@"36", nil];    [arr invert];    NSLog(@"%@",arr);}
Category的使用场景有那些呢:
1、类包含了很多个方法实现,而这些方法需要不同团队的成员来实现
2、当你在使用基础类库中的类时,你不想继承这些类而只想添加一些方法时。
 
Category能实现上面的需求,当然也有使用Category是需要注意的问题:
1、Category可以访问原始类的实例变量,但不能添加实例变量,如果想添加变量,那就通过继承创建子类来实现。
2、Category可以重载原始类的方法,不大不推荐这么做,这样会覆盖掉原始类的方法。如果确实要重载,那就通过继承创建子类来实现。
3、和普通接口有所区别的是,在Category的实现文件中的实例方法只要你不去调用它你可以不用实现所有声明的所有方法。

2.延展

延展的定义, 实现, 应用, 代码如下

/* *延展的作用就是定义自己的私有方法。 *形式和类目相同,不用新创建文件,只是把类目的interface地方的文件放在了你需要扩展的类的.m文件里边。 */@interface ViewController ()- (void)test;@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];    [self test];}- (void)test {    NSLog(@"延展的作用就是定义自己的私有方法。");}
注意:出了ViewController这个类后,在外界编译器是无法自动获取的,也就是说,对外界进行的[屏蔽,只有在自己的类的内部才能调用

3.协议

(1).协议声明了可以被其他的类实现的方法。协议本身必不会去实现。

(2).协议不是类,只是一个其他对象可以实现的接口。

定义一个协议

#import <Foundation/Foundation.h>
@protocol MarryProtocol <NSObject>//定义一个结婚协议,结婚协议也可以继承其它的协议
@required   //必须遵守的协议,在遵守MarryProtocol协议的类的.m文件中去实现里边的方法。
- (void)washClothes;
- (void)cook;
@optional  //可选的协议
- (void)makeMoney;
@end

代理(委托)模式:自己有需求,但是让别人去做。

定义一个Men类

#import <Foundation/Foundation.h>
#import "RoomService.h"
@interface Men : NSObject
@property(nonatomic,retain)NSString * name;
@property(nonatomic,assign)id<MarryProtocol> mate;//定义一个代理
-(id)initWithName:(NSString *)name;
-(void)needEat;
@end

定义一个Women类

#import <Foundation/Foundation.h>
#import "
MarryProtocol"
@interfaceWomen : NSObject <
MarryProtocol>  //遵守协议
@property(nonatomic,retain)NSString * name;
-(id)initWithName:(NSString *)name;
@end

在Men的实现里边

-(void)needEat
{
    [self.mate  cook];
}

在Women的实现里边有一个方法

-(void)cook

{

      NSLog(%@"wonmen正在做饭");

}

主函数里边

men.mate = women;

[men needEat];

打印出:wonmen正在做饭

4.协议也可以写在一个类里边,用到的时候引入类的头文件就可以。


参考自:http://cache.baiducontent.com/c?m=9d78d513d9981cee4fede5697c14c0111b43f1652ba7a4027fa5843e90732d405010e4ac57290704a2d20a6516dc3f4b9cf021053c1767f7c5c7d20c9bf985295c953a642e41d35612a448ee9d1a32c157cc0dafb251a0e7a772cbf58ece8c141591025b2d9da6dc1c534f942eed113be4ad9a431f&p=84759a46d6c11af50be2963c55569f&newp=8936d35685cc43e60dbd9b7d0d14a5231610db2151d59940&user=baidu&fm=sc&query=ios+%C0%E0%C4%BF+%D1%D3%D5%B9+%D0%AD%D2%E9&qid=9298de3f00001b5d&p1=1


0 0
原创粉丝点击