Objective-C知识总结(5)
block的基本使用
1 // 有參有返回值 2 /* 3 格式: 4 返回值類型 (^變量名)(參數(shù)類型及個(gè)數(shù)) = ^(形參列表){ 5 6 代碼塊語(yǔ)句; 7 8 return ; 9 10 }; 11 12 */ 13 // 定義一個(gè)有參數(shù)\有返回值的block 14 int (^myblock1)(int ,int) = ^(int x,int y){ 15 16 return x+y; 17 18 }; 19 20 int sum = myblock1(10,20); 21 NSLog(@"sum = %d",sum); 22 23 // 給變量重新賦值 24 myblock1 =^(int x,int y){ 25 26 return x*y; 27 28 }; 29 30 // 使用block,接收返回值 31 sum = myblock1(10,20); 32 NSLog(@"sum = %d",sum); 33 34 // 有參無(wú)返回值 35 36 /* 37 格式: 38 void (^變量名)(參數(shù)類型及個(gè)數(shù)) = ^(形參列表){ 39 40 代碼塊語(yǔ)句; 41 42 }; 43 44 */ 45 // 定義一個(gè)變量myblock2 同時(shí)進(jìn)行賦值 46 void (^myblock2)(int ,int )=^(int a,int b){ 47 48 NSLog(@"a + b = %d",a+b); 49 50 }; 51 52 myblock2(34,12); 53 54 // 先定義變量,再賦值 55 myblock2 = ^(int x,int y){ 56 57 int m = x>y?x:y; 58 NSLog(@"max = %d",m); 59 60 }; 61 myblock2(34,12); 62 63 // 無(wú)參無(wú)返回值 block 64 65 /* 66 //定義一個(gè)沒有參數(shù)\沒有返回值的block變量,并且賦值了 67 void (^block變量名)() = ^(){ 68 69 代碼塊的語(yǔ)句; 70 }; 71 72 優(yōu)化: 73 void (^block變量名)() = ^{ 74 75 代碼塊的語(yǔ)句; 76 }; 77 78 //block變量的使用 79 block變量名(); 80 81 */ 82 83 void (^myBlock4)()=^{ 84 85 NSLog(@"xxxx"); 86 printf("xxxxxx"); 87 88 }; 89 90 //使用block變量 91 myBlock4();block的typedef
typedef int (^myBlock)(int,int);myBlock a = ^(int x, int y){return x + y;};int c = a(1,2);block訪問(wèn)外部變量
1 int main(int argc, const char * argv[]) { 2 @autoreleasepool { 3 int m = 10; 4 5 NSLog(@"1:m = %d",m); // 10 6 NSLog(@"2:m addr = %p",&m); // 棧區(qū) 7 // NSString *str = @"abc"; 8 // NSLog(@"str = %p",str); 9 10 // 定義變量,并且賦值 11 // 當(dāng)定義block的時(shí)候,block會(huì)把外部變量以const的方式復(fù)制一份 12 // 存放到block的所在的內(nèi)存中 13 void (^myBlock)()=^{ 14 // m的值不能被修改 15 // m = 100; 16 17 NSLog(@"5:m addr = %p",&m); // 堆區(qū) 18 // 可以訪問(wèn)m的值 19 NSLog(@"3:in block m = %d",m); // 10 20 21 }; 22 23 NSLog(@"4:m addr = %p",&m); // 棧區(qū) 24 // 使用 25 myBlock(); 26 } 27 return 0; 28 }打印結(jié)果為
// 全局變量存在于數(shù)據(jù)段 int n=0; int main(int argc, const char * argv[]) {@autoreleasepool {__block int m = 10;NSLog(@"1:m add = %p",&m); // 棧區(qū)地址NSLog(@"2:m = %d",m);n = 10;NSLog(@"7:n add = %p",&n); // 數(shù)據(jù)段NSLog(@"8:n = %d",n); // 10// 靜態(tài)變量static int a = 33;NSLog(@"----------%p", &a); // 數(shù)據(jù)段// __block 不在以const的方式拷貝void (^myBlock)()=^{int x = 100; // 棧區(qū)// m的值可以被修改m = 100;// 全局變量可以修改n = 100;// 靜態(tài)變量可以修改a = 10;NSLog(@"4:m addr = %p",&m); // 堆區(qū)// 可以訪問(wèn)m的值NSLog(@"3:in block m = %d",m); // 100 NSLog(@"9:n add = %p",&n); // 數(shù)據(jù)段NSLog(@"10:n = %d",n); // 100 };myBlock();NSLog(@"5:m = %d",m); // 100NSLog(@"6:m addr = %p",&m); // 堆區(qū) NSLog(@"11:n add = %p",&n); // 數(shù)據(jù)段NSLog(@"12:n = %d",n); // 100 }return 0; }打印結(jié)果為
block使用注意
靜態(tài)變量 和 全局變量 在加不加 __block都會(huì)直接引用變量地址。也就意味著 可以改變修改變量的值,在沒有加__block參數(shù)的情況下
全局block:定義在函數(shù)外面的block是global(全體的)的 另外如果在函數(shù)內(nèi)部的block,沒有捕獲任何自動(dòng)變量,那么它也是全局的
棧block:區(qū)別為是否引用了外部變量
堆block:是對(duì)棧block copy得來(lái)。對(duì)全局block copy 不會(huì)有任何作用,返回的仍然是全局block
block作為函數(shù)的返回值
// 定義了一個(gè)新的類型 newType2 typedef int(^myBlock)(int ,int ); myBlock test(){// 返回block類型return ^(int a,int b){return a+b;};}int main() {myBlock n = test();int a = n(1,2);NSLog(@"a = %d", a); // 3 }block助記符 inlineblock
block 也可以這么定義
// 可以加上形參int (^block)(int x,int y) = ^(int x, int y){return x + y;};協(xié)議 Protocol
什么是協(xié)議?
一些方法的聲明,一般寫到一個(gè).h的頭文件中
方法有兩種:?1) 必須實(shí)現(xiàn) ?2) 選擇實(shí)現(xiàn)
協(xié)議的作用:
供其他的類去遵守,如果一個(gè)類遵守了一個(gè)協(xié)議,就應(yīng)該實(shí)現(xiàn)這個(gè)協(xié)議中定義的必須要實(shí)現(xiàn)的方法
協(xié)議的寫法
@protocol xxxx <NSObject> // 必須實(shí)現(xiàn)的方法(默認(rèn)) @required // 可選實(shí)現(xiàn)的方法 @optional@end遵守協(xié)議的步驟: ?1) 導(dǎo)入 頭文件 ?2) 遵守協(xié)議 ?3) 實(shí)現(xiàn)方法
protocol類型限制
第一種類型限制:給id類型增加限制
id<xxxxxxx> obj;
增加<xxxxxxx>以后,表示,obj只能賦值遵守了xxxxxxx協(xié)議的對(duì)象
id<xxxxxxx> obj = d;
第二種類型限制:
表示,obj2賦值的時(shí)候,必須是Girl對(duì)象,并其遵守 了 xxxxxxx協(xié)議.
Girl *mm = [Girl new];
Girl<xxxxxxx> *obj2 = mm;
protocol代理設(shè)計(jì)模式 ?
請(qǐng)看我之前的博客 ?>---請(qǐng)點(diǎn)擊這里---<
------------------------------------------------------------------------------------------------------------------------------------------------------------
其他四篇鏈家如下:
Objective-C知識(shí)總結(jié)(1)
Objective-C知識(shí)總結(jié)(2)
Objective-C知識(shí)總結(jié)(3)
Objective-C知識(shí)總結(jié)(4)
轉(zhuǎn)載于:https://www.cnblogs.com/melodyzhy/p/4684559.html
總結(jié)
以上是生活随笔為你收集整理的Objective-C知识总结(5)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: (王道408考研数据结构)第六章图-第四
- 下一篇: 关于事件的一点小总结