Objective-C知識總結(5),objective-c知識總結

來源:互聯網
上載者:User

Objective-C知識總結(5),objective-c知識總結

block的基本使用

 1  // 有參有傳回值 2         /* 3           格式: 4          傳回值類型 (^變數名)(參數類型及個數) = ^(形參列表){ 5           6                   代碼塊語句; 7           8                   return ; 9          10          };11          12          */13         // 定義一個有參數\有傳回值的block14         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         // 有參無傳回值35         36         /*37          格式:38          void (^變數名)(參數類型及個數) = ^(形參列表){39          40                代碼塊語句;41          42          };43          44          */45         // 定義一個變數myblock2 同時進行賦值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         // 無參無傳回值 block64         65         /*66           //定義一個沒有參數\沒有傳回值的block變數,並且賦值了67           void (^block變數名)() = ^(){68          69                 代碼塊的語句;70           };71          72           最佳化:73           void (^block變數名)() = ^{74          75          代碼塊的語句;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訪問外部變數

 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);         // 棧區 7         //        NSString *str = @"abc"; 8         //        NSLog(@"str = %p",str); 9         10         // 定義變數,並且賦值11         // 當定義block的時候,block會把外部變數以const的方式複製一份12         // 存放到block的所在的記憶體中13         void (^myBlock)()=^{14             // m的值不能被修改15             // m = 100;16             17             NSLog(@"5:m addr = %p",&m);     // 堆區18             // 可以訪問m的值19             NSLog(@"3:in block m = %d",m);  // 1020             21         };22         23         NSLog(@"4:m addr = %p",&m); // 棧區24         // 使用25         myBlock();26            }27     return 0;28 }

列印結果為

// 全域變數存在於資料區段int n=0;int main(int argc, const char * argv[]) {    @autoreleasepool {        __block int m = 10;        NSLog(@"1:m add  = %p",&m);   // 棧區地址        NSLog(@"2:m = %d",m);        n = 10;        NSLog(@"7:n add = %p",&n); // 資料區段        NSLog(@"8:n = %d",n);  // 10        // 靜態變數        static int a = 33;        NSLog(@"----------%p", &a); // 資料區段           // __block 不在以const的方式拷貝        void (^myBlock)()=^{            int x = 100; // 棧區            // m的值可以被修改            m = 100;            // 全域變數可以修改            n = 100;            // 靜態變數可以修改            a = 10;            NSLog(@"4:m addr = %p",&m);     // 堆區            // 可以訪問m的值            NSLog(@"3:in block m = %d",m);  // 100                        NSLog(@"9:n add = %p",&n); // 資料區段            NSLog(@"10:n = %d",n);     // 100        };        myBlock();                NSLog(@"5:m = %d",m);  // 100        NSLog(@"6:m addr = %p",&m); // 堆區                NSLog(@"11:n add = %p",&n); // 資料區段        NSLog(@"12:n = %d",n);      // 100           }    return 0;}

列印結果為

block使用注意

靜態變數 和 全域變數 在加不加 __block都會直接引用變數地址。也就意味著 可以改變修改變數的值,在沒有加__block參數的情況下

全域block:定義在函數外面的block是global(全體的)的 另外如果在函數內部的block,沒有捕獲任何自動變數,那麼它也是全域的

棧block:區別為是否引用了外部變數

堆block:是對棧block copy得來。對全域block copy 不會有任何作用,返回的仍然是全域block

block作為函數的傳回值

// 定義了一個新的類型 newType2typedef 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;};

協議 Protocol

什麼是協議?

一些方法的聲明,一般寫到一個.h的標頭檔中

方法有兩種: 1) 必須實現  2) 選擇實現

協議的作用:

供其他的類去遵守,如果一個類遵守了一個協議,就應該實現這個協議中定義的必須要實現的方法

協議的寫法

@protocol xxxx <NSObject>// 必須實現的方法(預設)@required// 可選實現的方法@optional@end

遵守協議的步驟:  1) 匯入 標頭檔  2) 遵守協議  3) 實現方法

protocol類型限制

第一種類型限制:給id類型增加限制

id<xxxxxxx> obj;

增加<xxxxxxx>以後,表示,obj只能賦值遵守了xxxxxxx協議的對象

id<xxxxxxx> obj = d;

第二種類型限制:

表示,obj2賦值的時候,必須是Girl對象,並其遵守 了 xxxxxxx協議.

Girl *mm = [Girl new];

Girl<xxxxxxx> *obj2 = mm;

protocol代理設計模式  

請看我之前的部落格  >---請點擊這裡---<

------------------------------------------------------------------------------------------------------------------------------------------------------------

其他四篇鏈家如下:

Objective-C知識總結(1)

Objective-C知識總結(2)

Objective-C知識總結(3)

Objective-C知識總結(4)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.