
類目(Category)
(1).為已知的類添加新的方法,無(wú)論是否知道類的源代碼,這些類包括自己定義的類和系統(tǒng)已有的類。
(2).將類的實(shí)現(xiàn)分散到多個(gè)不同的文件中,將多個(gè)類目的聲明放入同一個(gè).h文件中,將實(shí)現(xiàn)放入多個(gè).m方法中。
(3).使用類目創(chuàng)建對(duì)私有方法的前向引用,就是為類創(chuàng)建私有方法。
(4).向?qū)ο筇砑臃钦絽f(xié)議,現(xiàn)在逐漸被正式協(xié)議做替代。
注意:類目里面只能寫方法,不能寫聲明和屬性,所以,類目不能作為接口來(lái)用
注意:
1、類目無(wú)法向已有類中添加實(shí)例變量。
2、如果類目中的方法和已有類中的方法名稱沖突時(shí),類目中的方法優(yōu)先級(jí)高,如果方法名沖突,已有類中的原始方法便無(wú)法使用。
3、在使用類目的時(shí)候,最好是將自己擴(kuò)展的方法和原始方法區(qū)分開來(lái)。



NSString+LuisX.h文件中
#import <Foundation/Foundation.h>
#pragma mark - NSString:分類類型 LuisX:分類名
@interface NSString (LuisX) {
//不能在分類中定義成員
}
- (NSInteger)getMyStringLength; //聲明實(shí)例方法
+ (NSString *)getHomeDirectory; //聲明類方法
@end
NSString+LuisX.m文件中
#import "NSString+LuisX.h"
@implementation NSString (LuisX)
//實(shí)現(xiàn)實(shí)例方法
- (NSInteger)getMyStringLength{
NSInteger stringLength = [self length];
return stringLength;
}
//實(shí)現(xiàn)類方法
+ (NSString *)getHomeDirectory{
return NSHomeDirectory();
}
@end
類目演示
//////////類目演示//////////
#import <Foundation/Foundation.h>
#import "NSString+LuisX.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSString *str = @"FengXu";
NSInteger length = [str getMyStringLength];
NSString *homeDicStr = [NSString getHomeDirectory];
NSLog(@"實(shí)例方法: %ld", length);
NSLog(@"類方法: %@", homeDicStr);
//輸出: 實(shí)例方法: 6
//輸出: 類方法: /Users/apple
}
return 0;
}
延展(Extension)
(1).延展的作用就是定義自己的私有方法。
(2).在自己類的實(shí)現(xiàn)文件中添加類目(匿名類目)來(lái)聲明私有方法。(只有本類的.m文件中才能使用)。
(3).形式和類目相同,不用新創(chuàng)建文件,只是把類目的interface地方的文件放在了你需要擴(kuò)展的類的.m文件里邊。
Father.h文件中
#import <Foundation/Foundation.h>
@interface Father : NSObject
- (void)work;
@end
Father.m文件中
#import "Father.h"
//╭--------------------延展(管理私有)--------------------╮
//@interface...@end可省略,但不建議。(方便看出哪些是私有的方法)
//聲明私有,()中省略了private
@interface Father ()
@property (nonatomic, copy) NSString *company;
- (void)showMyInfo;
@end
//╰--------------------延展(管理私有)--------------------╯
@implementation Father{
//此處用來(lái)定義屬性(私有屬性)
NSString *_name;
}
- (void)work{
NSLog(@"公有方法");
[self showMyInfo];
}
- (void)showMyInfo{
NSLog(@"私有方法");
}
@end
延展演示
//////////延展演示//////////
#import <Foundation/Foundation.h>
#import "Father.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Father *father = [[Father alloc] init];
[father work];
//輸出: 公有方法
//輸出: 私有方法
}
return 0;
}
協(xié)議(Protocol)
(1).協(xié)議聲明了可以被其他的類實(shí)現(xiàn)方法。協(xié)議本身并不會(huì)去實(shí)現(xiàn)。
(2).協(xié)議不是類,只是一個(gè)其他對(duì)象可以實(shí)現(xiàn)的接口。
(3).一個(gè)類可以通過(guò)協(xié)議,用來(lái)遵循多個(gè)類中的方法,這樣可以做到多繼承的效果
注意:
@required 必須方法 (默認(rèn))
@optional 可選方法
Girl.h文件中
#import <Foundation/Foundation.h>
#warning ?????????? 1.聲明協(xié)議 ??????????
@protocol MarriageDelegate <NSObject>
@required //必須方法(默認(rèn))
- (void)makeMoney;
- (void)satisfyHer;
@optional //可選方法
- (void)cooking;
@end
@interface Girl : NSObject
#warning ?????????? 2.設(shè)置代理人屬性 ??????????
@property (nonatomic, assign) id<Marriage> delegate;
- (void)buybuybuy;
@end
Girl.m文件中
#import "Girl.h"
@implementation Girl
- (void)buybuybuy{
#warning ?????????? 3.代理人執(zhí)行方法 ??????????
[self.delegate makeMoney];
}
@end
Boy.h文件中
#import <Foundation/Foundation.h>
#import "Girl.h"
#warning ?????????? 4.簽訂協(xié)議 (當(dāng)前類中要實(shí)現(xiàn)必須方法) ??????????
@interface Boy : NSObject <MarriageDelegate>
@end
Boy.m文件中
#import "Boy.h"
@implementation Boy
#warning ?????????? 6.實(shí)現(xiàn)協(xié)議中聲明的必須方法 ??????????
- (void)makeMoney{
NSLog(@"賺錢");
}
- (void)satisfyHer{
NSLog(@"親吻");
}
@end
協(xié)議演示
//////////協(xié)議演示//////////
#import <Foundation/Foundation.h>
#import "Girl.h"
#import "Boy.h"
int main(int argc, const char * argv[]) {
//////////使用代理//////////
Girl *girl = [[Girl alloc] init];
Boy *boy = [[Boy alloc] init];
#warning ?????????? 5.指定代理人 ??????????
girl.delegate = boy;
[girl buybuybuy];
//輸出: 賺錢
//判斷是否對(duì)象是否遵循某些協(xié)議
BOOL result = [girl conformsToProtocol:@protocol(Marriage)];
if (result) {
NSLog(@"遵循Marriage協(xié)議");
}else{
NSLog(@"不遵循Marriage協(xié)議");
}
//輸出: 不遵循Marriage協(xié)議
return 0;
}