類目,延展,協議

1.類目

類目就是爲已存在的類添加新的方法。但是不能添加實例變量。比如系統的類,我們看不到他的.m文件,所以沒有辦法用直接添加方法的方式去實現。

@interface NSMutableArray (Sort) //爲NSMutableArray類添加Sort方法,Sort就是類目名,做到見名知意
-(void)invert;//方法
@end

實現部分

#import "NSMutableArray+Sort.h"
@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

在主函數裏邊可以直接調用上邊的invert方法

NSMutableArray * arr = [[NSMutableArray alloc]initWithObjects:@"12",@"4",@"89",@"88",@"36", nil];    
[arr invert];    
NSLog(@"%@",arr);

打印結果:

2012-08-13 11:12:03.324 類目[980:14503] (
   36,
   88,
   89,
   4,
   12
)


Category的使用場景有那些呢:
1、類包含了很多個方法實現,而這些方法需要不同團隊的成員來實現
2、當你在使用基礎類庫中的類時,你不想繼承這些類而只想添加一些方法時。

Category能實現上面的需求,當然也有使用Category是需要注意的問題:
1、Category可以訪問原始類的實例變量,但不能添加實例變量,如果想添加變量,那就通過繼承創建子類來實現。
2、Category可以重載原始類的方法,不大不推薦這麼做,這樣會覆蓋掉原始類的方法。如果確實要重載,那就通過繼承創建子類來實現。
3、和普通接口有所區別的是,在Category的實現文件中的實例方法只要你不去調用它你可以不用實現所有聲明的所有方法。

2.延展

延展的作用就是定義自己的私有方法。

形式和類目相同,不用新創建文件,只是把類目的interface地方的文件放在了你需要擴展的類的.m文件裏邊。

#import "Student.h"
@interface Student (extension)//爲Student類創建一個私有的方法text
-(void)text;
@end

@implementation Student
-(void)hello;
{
   [self   text];
}

-(void)text
{
   NSLog(@"你好");
}
@end

外界   [student hello]的時候就會打印出“你好”。但是在外界不能調用text方法,[student text]是不對的。只能在.m文件裏邊通過self來調用私有方法text。隱藏了內部的實現。

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.協議也可以寫在一個類裏邊,用到的時候引入類的頭文件就可以。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章