Objective-C中class、Category、Block的介绍
@class
當(dāng)定義一個(gè)類,必須為編譯器提供兩組消息,第一組(接口部分.h):構(gòu)建類的實(shí)例的一個(gè)基本藍(lán)圖。必須指定類名,類的超類,類的實(shí)例變量和類型的列表,最后是類的方法的聲明。第二組(實(shí)現(xiàn)部分.m):實(shí)現(xiàn)類的方法的代碼。
例如: ------------------------------ RockStar.h -------------------------------------------
#import<Foundation/Foundation.h>//?用#import呢,原因RockStar繼承NSObject類,需要知道NSObject的方法屬性等,所以用#import。
@class Banid;//這里為什么沒用#import “Banid”,導(dǎo)入包是把所有的信息導(dǎo)入,這個(gè)效率比較低,而@class只是說明Banid是一個(gè)類,在實(shí)現(xiàn)部分在導(dǎo)入包(import),效率高
@interface RockStar:NSObjtect
@end
?
-------------------------------- RockStar.m------------------------------------------------------------
#import ”RockStar.h”
#import “Banid.h”
@implementation RockStar
@end
Category分類有三個(gè)使用場景:定義一個(gè)類時(shí)某些情況系(需求變更),需要添加新的方法2、團(tuán)隊(duì)合作方法的實(shí)現(xiàn)3、對基礎(chǔ)類庫中的方法的擴(kuò)充,例如NSString+JSON.h為NSString這個(gè)類拓展一些解析JSON的方法
@interface Student(Text)//這是一個(gè)分類,是對Student類的拓展,對Stduent方法屬性等的補(bǔ)充。
@end
Protocal(協(xié)議說就是一系列方法的列表,其中聲明的方法可以被任何類實(shí)現(xiàn),這種模式一般稱為代理(delegation0式,相當(dāng)于java中的接口,但是協(xié)議中的方法可以部分實(shí)現(xiàn),不需要全部
------------------------------TabelPrinter.h-----------------
@protocal TablePrintDataSource
@required//必需的,默認(rèn)是必須的,也就是使用的類必須實(shí)現(xiàn)所有的方法(但也不強(qiáng)求也就是說你不實(shí)現(xiàn)編譯器也可以通過,再次強(qiáng)調(diào)OC是一種弱語言)
-(NSString*)stringForRowAtIndex: (int)index;
-(int) numberOfRowsInTable;
@optionl//可選的
-(NSString*) tableTitle;
-(BOOL) printLineNumber;
@end
?
@interface TablePrinter:NSObject
@property(nonatomic,assign)id<TablePrintDataSource> datasource;//這里弱引
-(void)printable;
@end
在另一個(gè)類中使用時(shí)在.h中添加@protocal TablePrintDataSource ;在.m中添加
#import “Table”
或者協(xié)議可以單獨(dú)寫出來:項(xiàng)目中有,別的地方用時(shí)在.h中添加@protocal TablePrintDataSource ;在.m中添加#import“TablePrintDataSource.h”
Block
Block可以訪問外面定義的變量,__block int c=20,這樣可以外部寫該外部變量,否則不可以修改,只可以使用
例子1、
int j=10;
int (^blockPtr)(int)=^(int n){return j+n}; //帶一個(gè)參數(shù)返回值為int的塊,塊是基于棧的,塊與自動(dòng)變量擁有相同的生命周期。(^)脫字符
j=20;
int k=blockPtr(5);//k is 15,not 25
例子2、
Void someFunction(int (^blockArg)(int));
Int (^doubler) (int)=^(int n){return n*2};
someFunction(doubler);?
例子3、
void someFunction(int (^blockArg)(int));
someFunction(^(int n){ return n*2;});
例子4、
Void text()
{
???????? Typedef int (^Sum)(int,int);
???????? Sum sum=^(int a,int b){return a+b;};
轉(zhuǎn)載于:https://www.cnblogs.com/zhao123/p/3196717.html
總結(jié)
以上是生活随笔為你收集整理的Objective-C中class、Category、Block的介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring Boot 学习(七、Spr
- 下一篇: Android - AsyncTask你