OC 11 1類目與延展

2021-07-16 21:41:54 字數 3332 閱讀 3631

@inte***ce

tool : nsobject

@property (nonatomic,strong)nsstring *property1;

-(void)function1; //原始類的方法

@end

既然建立了類目,我們就在tool.h接著上面繼續往下,咱們來用一下:

#pragma mark ---類目---

//在類目中為原類新增新的方法和屬性

/* ✪類目的使用場景

1.類包含了很多個方法實現,而這些方法需要不同團隊成員來實現

2.當你在使用基礎類庫中的類時,你不想繼承這些類而指向新增一些方法時

//比如 nsobject沒有你所需要的功能,就可以新增個類目,類目中就可以寫你需要的方法,注意,不要被誤導了,

✪使用類目的時候需要注意的問題

①類目可以訪問原始類的例項變數。但不能新增例項變數,如果想新增例項變數,那就通過繼承建立子類來實現

②類目可以過載原始類的方法,但不推薦這麼做,這樣會覆蓋掉原始類的方法。如果確實要過載,那就通過繼承建立子類來實現

③和普通介面有所區別的是,在類目的實現檔案中的例項方法只要你不去呼叫它你可以不要實現所有宣告的所有方法。

*/@inte***ce

tool (toolcategory)

///*

ios執行時機制

ios執行時機制,簡單來說,就是蘋果為開發者提供的一套執行時動態建立類、方法、屬性的api,它是一套純c語言的api。

*/@property (nonatomic ,strong)nsstring *property2;

-(void)function2;

//-(void)function1; //並不建議這麼做

@end

我們來看看tool.m 的**:

#import "tool.h"

#import "objc/runtime.h"

@inte***ce

tool ()

@end

@implementation

tool

-(void)function1

@end

@implementation

tool (toolcategory)

-(void)function2

//-(void)function1

#pragma mark --合成類目中的屬性---

-(void)setproperty2:(nsstring *)property2

-(nsstring *)property2

@end

**片中提到了 合成類目中的屬性,用的就是之前學過的設定器和訪問器。

當然,既然建了類目,咱們就給類目寫個方法,去到tool+tool_category.h檔案:

-(void)function3;
給它乙個function3的方法,然後去.m檔案實現一下:

-(void)function3
再回到viewcontroller.m函式中:

tool *tool = [tool new];//建立乙個tool物件

[tool function1]; //呼叫function1方法

[tool setvalue:@"my name is jason" forkey:@"_name"];//利用kvc給tool物件賦值

tool.property2 = @"property2"; //給property2賦值

[tool function2]; //呼叫function2

// [tool function3];

咱們執行一下,看到結果是:

接下來,咱來舉個例子講講延展,去到myclass_myclass_extension.h檔案:

給它乙個方法:-(void)testextension2;

我們去myclass.m中實現一下:

首先是匯入延展的乙個標頭檔案,然後:

@inte***ce

myclass ()

-(void)testextension;

@end

@implementation

myclass

-(void)testextension

-(void)testextension2

@end

由於延展呼叫的私有方法是不能進行呼叫的,所以只能依賴別的方法來進行輸出,去到nsobject+nsobject_category.h檔案,給它寫兩個方法,方便呼叫:

#import 

@inte***ce

nsobject (nsobject_category)

-(void)test1;

-(void)test2;

@end

然後回到myclass.m檔案中,咱們呼叫一下這兩個方法:

@implementation

myclass

-(void)test1

-(void)test2

-(void)testextension

-(void)testextension2

@end

然後,再次回到viewcontroller.m:

myclass *myclass = [[myclass alloc]init];

//responds

toselector:(sel)aselector 這個方法可以檢查當前物件是否響應aselector方法

if ([myclass respondstoselector:

@selector(test1)])

if ([myclass respondstoselector:

@selector(test2)])

-(bool)respondstoselector:(sel)aselector;

判斷receiver是否響應某訊息,注意:不包括類方法。

最後咱們來看下執行結果:

OC 08 類目延展協議

類目的特點 若類目中重寫了類現有的方法,則優先呼叫類目方法 類目無法新增成員變數,而可以新增屬性 類目中新增屬性需要使用 dynamic動態合成,手動實現setter和getter方 法,並且改類已經存在對應的成員變數 為什麼我們要使用類目?某些情況下,我們需要對一些現有的類新增一些方法 通常做法是...