作用
類目就是爲已存在的類添加新的方法。但是不能添加實例變量。比如系統的類,我們看不到他的.m文件,所以沒有辦法用直接添加方法的方式去實現。
@interface NSMutableArray (Sort) //爲NSMutableArray類添加Sort方法,Sort就是類目名,做到見名知意 例: 爲UIColor 添加一個 Addtions @interface UIColor (Addtions) +(UIColor *)randomColor; @end #import "UIColor+Addtions.h" @implementation UIColor (Addtions) +(UIColor *)randomColor{ CGFloat red=arc4random()%256/255.0; CGFloat green=arc4random()%256/255.0; CGFloat blue=arc4random()%256/255.0; UIColor *color=[UIColor colorWithRed:red green:green blue:blue alpha:1]; return color; } @endCategory的使用場景有那些呢:
1、類包含了很多個方法實現,而這些方法需要不同團隊的成員來實現
2、當你在使用基礎類庫中的類時,你不想繼承這些類而只想添加一些方法時。
Category能實現上面的需求,當然也有使用Category是需要注意的問題:
1、Category可以訪問原始類的實例變量,但不能添加實例變量,如果想添加變量,那就通過繼承創建子類來實現。
2、Category可以重載原始類的方法,不大不推薦這麼做,這樣會覆蓋掉原始類的方法。如果確實要重載,那就通過繼承創建子類來實現。
3、和普通接口有所區別的是,在Category的實現文件中的實例方法只要你不去調用它你可以不用實現所有聲明的所有方法。
延展
2.延展
延展的作用就是定義自己的私有方法。
形式和類目相同,不用新創建文件,只是把類目的interface地方的文件放在了你需要擴展的類的.m文件裏邊。
@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
代理(委託)模式:自己有需求,但是讓別人去做。
例:
創建一個MarryProtocol協議
@protocol MarryProtocol <NSObject>
@required
-(void )makeMoney;
-(void)washCloth;
-(void)cook;
@optional
-(void)doHouseWork;
@end
創建一個boy類
#import "MarryProtocol.h"
#import "Girl.h"
@interface Boy : NSObject
@property (nonatomic,assign)id<MarryProtocol> wife;
-(void)rice;
-(void)washClothes;
-(void)giveMoney;
@end
//
實現
#import "Boy.h"
@implementation Boy
-(void)rice
{
[_wife cook];
}
-(void)washClothes
{
[_wife washCloth];
}
-(void)giveMoney
{
[_wife makeMoney];
}
@end
創建一個girl類
#import "MarryProtocol.h"@interface Girl : NSObject <MarryProtocol>//尊守協議
@end
實現
#import "Girl.h"
@implementation Girl
-(void )makeMoney
{
NSLog(@"掙錢");
}
-(void)washCloth
{
NSLog(@"洗衣服");
}
-(void)cook
{
NSLog(@"做飯");
}
@end
主程序調用
Boy *boy=[[Boy alloc]init];
Girl * girl=[[Girl alloc]init];
boy.wife=girl;
[boy rice];
[boy washClothes];
[boy giveMoney];
協議也可以寫在一個類裏邊,用到的時候引入類的頭文件就可以。