目錄:
一、類目什麼是類目?
類目(也稱類別: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的檔案進行擴充套件,延展一般...