block的使用(三)

// 棧區,堆區,BSS,數據區,代碼區spa


#import <Foundation/Foundation.h>.net


int main(int argc, const char * argv[]) {orm

    @autoreleasepool {內存

        

        // 第一種和第二種get

        //int i = 10; // 棧區編譯器

        

        // 第三種 __block修飾符告訴編譯器,i的值能夠在block內部修改(忽略檢查)io

        // 注意:一旦使用__block修飾以後,之後使用的都是堆區的變量。編譯

        __block int i = 10;import

        

        NSLog(@"i = %d, i addr = %p", i,&i); // i = 10, i addr = 0x7fff5fbff77c變量

        

        // 定義一個無參無返回值的block

        // 注意在block代碼塊的內部使用外部變量,

        // 1)block定義的時候,把block外部的變量的值copy到了內存的堆區

        // 2)拷貝的過程當中使用了const(以const的形式把外部變量作了一個copy

        void (^myblock)() = ^{

            

            // 第一種

            // i = 100; 會報錯

            // block 代碼塊

            // 1)可否使用變量i

            //NSLog(@"i = %d", i); // i = 10

            // 2)變量i存儲在哪一個內存區域

            //NSLog(@"i addr = %p",&i); // addr = 0x100102750 堆區

            

            // 第二種

            //int i = 100; // 這是定義一個局部變量 棧區

            //NSLog(@"i = %d", i); // i = 100

            //NSLog(@"i addr = %p",&i); // addr = 0x7fff5fbff72c

            

            // 第三種 必定要修改i

            i = 100;

            NSLog(@"i = %d, i addr = %p", i,&i); //i = 100, i addr = 0x1004004b8

            

        };

        myblock();

        

        i = 20;

        NSLog(@"i = %d, i addr = %p", i,&i); //i = 20, i addr = 0x7fff5fbff77c

                                             // i = 20, i addr = 0x1004004b8 第三種


        

    }

    return 0;

}

相關文章
相關標籤/搜索