普通的局部變量,block內部只會引用它初始的值(block定義那一刻),不能跟蹤它的改變
void test()
{
int age = 10;
void (^block)() = ^{
// 普通的局部變量,block內部只會引用它初始的值(block定義那一刻),不能跟蹤它的改變
NSLog(@"----age=%d", age);
};
age = 20;
block();
}
這裡的結果是10;其實在編譯的時候,是相當於這樣的:
void test2()
{
int age = 10;
void (^block)() = ^{
// 普通的局部變量,block內部只會引用它初始的值(block定義那一刻),不能跟蹤它的改變
NSLog(@"----age=%d", 10);
};
age = 20;
block();
}
這裡的這個值 是死的。所以無論你後面把age改成多少,block都不關心。換句話說:這裡的age是局部變量,出了大括號就死了,所以直接把這個10拿過來,比較安全
我們看一下,被block引用的變量的情況:
block內部能夠一直引用被__block修飾的變量
void test3()
{
__block int age = 10;
void (^block)() = ^{
// block內部能夠一直引用被__block修飾的變量
NSLog(@"----age=%d", age);
};
age = 20;
block();
}
這裡:block能一直監聽著這個age的值的改變(無論是局部變量還是全局變量),所以這裡打印出來的是age是20
__block修飾的變量,就能保住這個變量的命
這裡我們來看一下,被static修飾的變量,是靜態變量,靜態是永遠在內存中,所以block看到static修飾的這個變量是永遠存在內存中的,那麼block就能每次都能拿到這個變量,所以你age的值的改變。block都能拿到,所以這是動態訪問的,不是把10直接拿過來
void test4()
{
static int age = 10;
void (^block)() = ^{
// block內部能夠一直引用被static修飾的變量
NSLog(@"----age=%d", age);
};
age = 20;
block();
}
int num = 10;
void test5()
{
void (^block)() = ^{
// block內部能夠一直引用全局變量
NSLog(@"----num=%d", num);
};
num = 20;
block();
}
這裡打印出來的num 是20 。為什麼呢?
因為這裡的num是全局變量,那麼既然是全局變量,就一直在內存中,block就能實時跟新這個值的改變。
總結,那麼我們現在判斷的時候,我們只需要判斷這個變量是不是馬上就銷毀了就行了。但是注意一下__block修飾的變量就行