block有三種:
NSStackBlock存儲于棧區(qū)
NSGlobalBlock存儲于程序數(shù)據(jù)區(qū)
NSMallocBlock存儲于堆區(qū)
NSGlobalBlock?靜態(tài)區(qū)block,這是一種特殊的bloclk,因為不引用外部變量而存在欢顷。另外,作為靜態(tài)區(qū)的對象,它的釋放是有操作系統(tǒng)控制的,這一點我們最后再聊床三。?
NSStackBlock?棧區(qū)block,位于內(nèi)存的棧區(qū),一般作為函數(shù)的參數(shù)出現(xiàn)。?
NSMallocBlock?堆區(qū)block,位于內(nèi)存的堆區(qū),一般作為對象的property出現(xiàn)。
如果一個blcok引用了外部變量是棧block,則其不引用外部變量就成為了靜態(tài)blcok华畏。?
如果一個block引用了外部變量是堆block,則其不引用外部變量就成為了靜態(tài)block。
MRC 下
@property(nonatomic,copy)void(^block)();
int value =10;
void(^blockA)() = ^????{
? ? ? NSLog(@"value: %d",value);? ?
};
NSLog(@"MRC 引用計數(shù): %ld, block is: %@",[blockA retainCount], blockA);
void(^blockB)() = ^{
? ? ? NSLog(@"blockB");? ?
};
NSLog(@"MRC 引用計數(shù): %ld, block is: %@",[blockB retainCount], blockB);? ?
_block = [blockA copy];
NSLog(@"MRC 引用計數(shù): %ld, block is: %@",[self.block retainCount],self.block);? ? ? ? [_block retain];
NSLog(@"MRC 引用計數(shù): %ld, block is: %@",[self.block retainCount],self.block);? ? [_block release];
NSLog(@"MRC 引用計數(shù): %ld, block is: %@",[self.block retainCount],self.block);
打印結(jié)果:
MRC 引用計數(shù):1, blockis: <__NSStackBlock__:0x7fff59038bc8>? ?
MRC 引用計數(shù):1, blockis: <__NSGlobalBlock__:0x106bc70e0>? ?
MRC 引用計數(shù):1, blockis: <__NSMallocBlock__:0x610000058330>? ?
MRC 引用計數(shù):1, blockis: <__NSMallocBlock__:0x610000058330>? ?
MRC 引用計數(shù):1, blockis: <__NSMallocBlock__:0x610000058330>
可以看到眶熬,blockA 與 blockB 的差異只在于有沒有調(diào)用外部變量侵佃,這點差異導(dǎo)致它們的類型不同,存儲位置不同踱蛀。