請尊重原創,謝謝!
block 有三種型別 nsconcreteglobalblock、_nsconcretestackblock、_nsconcretemallocblock
分別儲存在資料區,記憶體棧區,記憶體堆區
那麼什麼時候儲存在哪個區上呢?我們看看下面的例子。
#import "viewcontroller.h"
static nsstring *globalstr=@"global";
typedef void (^blk_t)(int);
@inte***ce viewcontroller ()
@end
@implementation viewcontroller
。。。省略
- (ibaction)buttontaped:(id)sender ;
nslog(@"bl1 is at %@",bl1);
blk_t bl2=^void(int a);
//引用了外部變數即為stack block,block的實現與上面的完全相同
nslog(@"bl2 block is %@",^void(int a));
//引用了外部變數即為stackblock,arc下當引用此block變數時自動複製到堆上
nslog(@"bl2 is %@",bl2);
bl1(5);//呼叫
bl2(10);//呼叫
}@end
列印的結果:
bl1 is <__nsglobalblock__: 0x10f13c0d0>
bl2 block is <__nsstackblock__: 0x7fff50ac3078>
bl2 is <__nsmallocblock__: 0x7fc81bf21aa0>
a is 5,local str is localstr1,global str is globalstr1
a is 10,a2 is 3,b2 is 6,local str is localstr1,global str is globalstr1
參考:
bl1裡的變數a是其作用域裡的區域性變數,而靜態區域性變數和靜態全域性變數還有非靜態的全域性變數都是儲存在靜態(全域性)資料儲存區分配即global
不使用arc的話,引用棧block是不會自動複製到堆上的
使用arc的話,引用棧block會複製到對上
注意:這裡的引用是強引用 即前面沒有__weak __assign這種關鍵字的。如果前面加了__weak 那麼指向的block還在棧上並不會複製到堆上
程式在記憶體中的分布
在現代的作業系統中,當我們說到記憶體,往往需要分兩部分來講 物理記憶體和虛擬記憶體。從硬體上講,虛擬空間是cpu內部的定址空間,位於mmu之前,物理空間是匯流排上的定址空間,是經過mmu轉換之後的空間。一般我們所說的程式在記憶體中的分布指的就是程式在虛擬記憶體中的儲存方式。從低位址到高位址,可分為下...
程式在記憶體中的分布
在現代的作業系統中,當我們說到記憶體,往往需要分兩部分來講 物理記憶體和虛擬記憶體。從硬體上講,虛擬空間是cpu內部的定址空間,位於mmu之前,物理空間是匯流排上的定址空間,是經過mmu轉換之後的空間。一般我們所說的程式在記憶體中的分布指的就是程式在虛擬記憶體中的儲存方式。從低位址到高位址,可分為下...
程式在記憶體中的分布
在現代的作業系統中,當我們說到記憶體,往往需要分兩部分來講 物理記憶體和虛擬記憶體。從硬體上講,虛擬空間是cpu內部的定址空間,位於mmu之前,物理空間是匯流排上的定址空間,是經過mmu轉換之後的空間。一般我們所說的程式在記憶體中的分布指的就是程式在虛擬記憶體中的儲存方式。從低位址到高位址,可分為下...