OC 類目延展協議

2021-07-05 03:57:19 字數 4758 閱讀 1965

目錄:

一、類目

什麼是類目?

類目(也稱類別:category)是一種為現有類新增新方法的方式。

類目和乙個類的實現非常相似,只是語法稍有不同:

類目的語法:

類目的特點:

為什麼我們要使用類目?

類目例項

現在我們要對nsstring增加新的方法用於比較兩個字串的大小,告訴使用者誰大。

第一步:建立類目

第二步:在.h中建立乙個方法,該方法就是類目給nsstring增加的方法,用於比較兩字字串大小

nsstring + compare.h

- (nscomparisonresult)comparevalue:(nsstring *)string;
nsstring + compare.m

#import "nsstring+compare.h"

@implementation

nsstring (compare)

- (nscomparisonresult)comparevalue:(nsstring *)string

nsinteger a = [self integervalue];

nsinteger b = [string integervalue];

if (a > b) else

if (a < b)

nslog(@"first = second");

return

0;}

main.m

nstring *string = @"123";

nsstring *string2 = @"234";

nsinteger value = [string comparevalue:string2];

nslog(@"%ld",value);

上面說過類目可以新增屬性,我們來看看例項
我們建立乙個person類,給這個類新增類目

person+agedifference.h

#import "person.h"

@inte***ce

person (agedifference)

//為person新增身份證號code屬性

//類目中屬性僅僅完成了宣告部分

@property (nonatomic, retain) nsstring *code;

- (nsinteger)agedifferencewithperson:(person *)person;

@end

person+agedifference.m

#import "person+agedifference.h"

@implementation

person (agedifference)

//@dynamic 屬性動態合成:需要手動實現setter和getter方法,並且與屬性宣告部分一致

@dynamic code;

- (void)setcode:(nsstring *)code

}- (nsstring *)code

- (nsinteger)agedifferencewithperson:(person *)person

return labs(self

.age - person.age);

}@end

main.m

person *person = [[person alloc] init];

person *person1 = [[person alloc] init];

person1.code = @"2345678";

nsinteger age = [person agedifferencewithperson:person1];

nslog(@"age difference is %ld",age);

nslog(@"ffff:%@",person1.code);

二、延展

類的私有方法
注意:

//延展為類宣告私有方法,外部不可見,只有本類可以使用

//延展可以宣告方法,成員變數,屬性

@inte***ce

person ()

@end

這種方式使用延展,@implementation部分可直接新增到person類的實現中;注意如果是給其他檔案中的類延展則不能省略這些。

延展的例項
在剛剛建立的person類的.m檔案直接寫延展

person.m

#import "person.h"

//延展

@inte***ce

person ()

//為類宣告私有方法,外部不可見,只有本類可以使用

//可以宣告方法,成員變數,屬性

- (nsinteger)changenumber:(nsnumber *)stringvalue;

@end

@implementation

person

- (instancetype)initwithname:(nsstring *)name age:(nsinteger)age

return

self;

}- (nsinteger)changenumber:(nsnumber *)stringvalue

@end

可以發現在延展裡面的方法,只能在本類中呼叫,不可以在其他地方呼叫

三、協議,委託模式

協議
委託模式

delegate本身是一種設計模式。

原理:自己不做的事,找乙個委託人(delegate)來幫你做

注意:協議protocol 和委託delegate 是兩個完全不同的概念 放在一起說 是因為我們總是在同乙個標頭檔案裡看到它們;

例項:顧客委託商家買乙個iphone6
我們建立商家和顧客兩個類,分別為customer和business

建立**委託,我們分為三步驟

第一步:協議

第二步:**屬性

第二步:設定**人

customer.h

#import 

//協議:通常是方法列表,有兩個關鍵字@required(方法必須實現),@optional(方法可以實現也可不實現),如果兩個關鍵字都不加,預設required

@protocol

mydelegate

-(void)buyiphone:(nsstring*)iphonetype; //**傳值方法

@end

@inte***ce

customer : nsobject

//delegate屬性:一般需使用弱引用(assign或weak)

@property (nonatomic, assign)id

delegate;

- (void)willbuy;

@end

customer.m

#import "customer.h"

@implementation

customer

- (void)willbuyelse

}@end

business.h

#import 

#import "customer.h"

@inte***ce

business : nsobject

//要成為**人必須遵守協議,並且實現協議的方法

@end

business.m

#import "business.h"

@implementation

business

//實現協議的方法

-(void)buyiphone:(nsstring*)iphonetype

@end

main.m

//委託協議

customer *custom = [[customer alloc] init];

business *business = [[business alloc] init];

custom.delegate = business;//設定**人

[custom willbuy];

OC學習 協議 類目和延展

定義乙個student類 import 協議studentprotocol protocol studentprotocol property nonatomic,assign nsinteger age void fun1 end student類遵循協議studentprotocol inte ...

類目 延展 協議

1.類目 類目就是為已存在的類新增新的方法。但是不能新增例項變數。比如系統的類,我們看不到他的.m檔案,所以沒有辦法用直接新增方法的方式去實現。inte ce nsmutablearray sort 為nsmutablearray類新增sort方法,sort就是類目名,做到見名知意 void inv...

延展 協議 類目

一.延展 1.延展以 inte ce開頭,然後寫當前延展的類名,類名後加乙個 到 end結束 2.一般延展會寫在自己寫的.m檔案中,把一些不想讓外部呼叫的屬性放在延展裡,這樣這條屬性只能夠在類的內部使用,外部使用不了,盡最大可能保護當前類的安全 3.類目一般是給看不見.m的檔案進行擴充套件,延展一般...