標籤:blog class ext int http c
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.協議也可以寫在一個類裡邊,用到的時候引入類的標頭檔就可以。