Objective-C---6---Block

1. block

1. Block本質上是匿名函數,定義在main函數內部,和C語言的函數還是有區別的

        /*
         寫⼀個 返回值爲整型 參數爲OC字符串(僅一個參
         數)的block,實現將字符串轉換爲整型的功能。
        */
        int (^stringToInt)(NSString *) = ^(NSString *str){
            return [str intValue];
        };
        int a = stringToInt(@"123456987654");
        NSLog(@"%d",a);


2. 使用typedef定義block:

typedef int(^twoNumbers)(int ,int);
twoNumbers subValue = ^(int a, int b){
            return a - b;
        };
        NSLog(@"%d", subValue(12, 3));

3. 在block內部可以訪問外部變量:

// 訪問外部變量:
        void (^MyBlock)() = ^{
            NSLog(@"%@", str);
        };
        MyBlock();

4. 變量地址是否相同:

// 訪問外部變量時,地址是同一個嗎:
        int b = 6;
        NSLog(@"外部地址:%p", &b);
        void (^MyBlock)() = ^{
            NSLog(@"內部地址:%p", &b);
        };
        MyBlock();  // 結果是:外部地址:0x7fff5fbff7ac     內部地址:0x7fff5fbff798   兩個地址不一樣

5.修改局部變量: __block

//  修改外部變量:
        __block int c = 0;
        twoNumbers subValue = ^(int a, int b){
            c = a - b;
            return c;
        };
        subValue(12, 3);
        NSLog(@"%d", c); // 結果是:9

總結:

在block內部可以訪問外部變量,

在block內部不能修改局部變量的值,

block內部訪問變量的地址和外部變量本身的地址不一樣,相當於拷貝了一份,

如果想在block內部對外部變量進行修改:有兩種方法:   ----a:將外部變量定義爲全局變量    ------b:在外部變量前加__block


2. block與數組排序:

#pragma mark--- block與數組排序
        {
// 1. 第一種排序方法: 自己寫的方法  直接調用
        NSArray *array = [NSArray arrayWithObjects:@"sd", @"gf", @"bgf", @"sadf", nil];
        
        NSComparator com = ^(id str1, id str2){
            return -[str1 compare:str2];
        };
        
        NSArray *sortArray = [array sortedArrayUsingComparator:com];
        NSLog(@"%@", sortArray);
            
            
// 2. 第二種排序:系統的不用自己定義方法
            NSArray *sortArray2 = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
                return [obj1  compare:obj2];
            }];
            NSLog(@"sortArray2:%@", sortArray2);
      }

3. iOS中的字面量:

字面量是⼀種新型的寫法,能在⼀定程度上簡化代碼。

字面量創建的對象是便利構造的,且是不可變的。

例如:字典,集合,字符串,數組,等的簡單創建就是使用了字面量



發佈了44 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章