Objective-C 「類目、延展、協(xié)議」

Objective-C

類目(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)。

創(chuàng)建Objective-C文件
創(chuàng)建類目文件
生成類目文件

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;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 概述 OC用于拓展已存在類的內(nèi)置功能是它最強(qiáng)大的功能之一。類目、延展、協(xié)議提供了可以讓你擴(kuò)展類功能的方式。使用他們...
    abios閱讀 334評(píng)論 0 0
  • 為什么使用類目是一種為現(xiàn)有的類添加新方法的方式有時(shí)需要對(duì)現(xiàn)有的類添加一些方法,之前都是通過(guò)繼承相關(guān)的類,然后再子類...
    PeterKock閱讀 1,044評(píng)論 0 6
  • 1.項(xiàng)目經(jīng)驗(yàn) 2.基礎(chǔ)問(wèn)題 3.指南認(rèn)識(shí) 4.解決思路 ios開發(fā)三大塊: 1.Oc基礎(chǔ) 2.CocoaTouch...
    扶光啟玄閱讀 5,204評(píng)論 0 13
  • 安寧,在工作中是找不到的,它不在歡樂(lè)中,也不在這個(gè)世界上或者這個(gè)修道院中,它僅僅存在于人的靈魂里。 毛姆的作品都離...
    曌則璀璨閱讀 542評(píng)論 0 0
  • 26歲多,已經(jīng)工作了兩年。 至今為止的人生里,沒(méi)有大的磨難和波折,從小到大很多憂慮,沒(méi)有真的實(shí)現(xiàn)過(guò)什么心愿,盡管認(rèn)...
    今魚閱讀 219評(píng)論 0 0

友情鏈接更多精彩內(nèi)容