---------------------- ASP.Net+Unity開發、.Net教育訓練、期待與您交流! ----------------------
一、block:block是OC中特有的資料類型。作用與函數類似
定義:傳回值 (^myBlock)(形參類型) = ^(類型 形參//這裡如果沒有參數可以省略括号){//定義格式與指向函數的指針相似
//代碼
return ....;
}; //這裡不要忘加分号
例如:
<span style="font-size:18px;">#import <Foundation/Foundation.h>
typedef int (^myBlock) (int,int); //每次定義都很麻煩,可以生成定義模版
int main() {
__block int a = 0;
int b = 1;
int (^sumBlock)(int,int) = ^(int a, int b) { //定義格式與指向函數的指針類似
return a+b;
}; //定義一個block
myBlock minusBlock = ^(int a, int b) { //用生成的模版定義
return a-b;
};
void (^testBlock)() = ^ {
a = 2;
// b = 3; //這句會報錯,因為預設block不可以修改局部變量
};
NSLog(@"a=%d,b=%d",a,b);
NSLog(@"%d",sumBlock(2,4)); //調用方法與函數相同
NSLog(@"%d",minusBlock(8,6));
return 0;
}</span>
總結:
1、block内部可以通路外面的變量;
2、預設情況下,block内部不能修改外面的局部變量;
3、給局部變量加上__block關鍵字,這個局部變量就可以在block内部修改。
用途:
1、快速枚舉;
2、向方法中傳遞block;
3、靈活代碼。
--------------------------------------------------------------------------------------------------------------------------------------------------------
二、protocol(協定):類似于JAVA中的接口,用來聲明方法,通常用在代理模式中
用途:
1、可以用來聲明一大堆方法(不能聲明成員變量)
2、隻要某個類遵守了這個協定,就相當于擁有這個協定中的所有方法聲明
3、隻要父類遵守了某個協定,就相當于子類遵守了
例如:
<span style="font-size:18px;">#import <Foundation/Foundation.h>
@protocol myProtocol <NSObject>
@required //必須實作方法(預設)
- (void)test;
@optional //可選實作方法
- (void)test2;
@end
@interface Person : NSObject <myProtocol>
@end
@implementation Person
- (void)test { //實作必須實作的方法,可選方法test2不實作也不會報警告
NSLog(@"test");
}
@end
int main() {
Person *p = [[Person alloc]init];
[p test];
[p release];
return 0;
}</span>
總結:
1、一個協定可以遵守其他多個協定,多個協定之間用逗号隔開;
2、一個協定遵守了其他協定,就相當于擁有了其他協定中的方法聲明;
3、NSObject有一個基協定,最根本最基本的協定,協定中聲明了許多方法比如 description、retain、release等;
4、建議每個新的協定都要遵守NSObject協定。
三、categories(類别、分類、類目):不改變原來某類檔案的情況下為某一個類添加新的方法
例如:
#import <Foundation/Foundation.h>
@interface Person : NSObject
@end
@implementation Person
@end
@interface Person (J)
- (void)test;
@end
@implementation Person (J) //為Person這個類添加一個分類,括号中填的是自己為該分類起的名字
- (void)test {
NSLog(@"test");
}
@end
int main() {
Person *p = [[Person alloc]init];
[p test];
return 0;
}
注意:catecoriges不可以為類添加成員變量。
---------------------- ASP.Net+Unity開發、.Net教育訓練、期待與您交流! ----------------------詳細請檢視:www.itheima.com