關(guān)于block總結(jié)
block有三種:
NSGlobalBlock?靜態(tài)區(qū)(全局區(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。
一浓恶、聲明一個block
1.不引用任何外部變量(block外部的局部變量)block存放在內(nèi)存的數(shù)據(jù)區(qū)域(.data區(qū)域)GlobalBlock
eg:
- (void)globalBlockTest {
? ? ? ? ?NSLog(@"%@", ^(){
? ? ? ? ? ? ? NSLog(@"hello world...");
? ? ? ? });
}
輸出: <__NSGlobalBlock__: 0x101796120>
2.若在block內(nèi)部引用其外部變量(局部變量)玫坛,那么該block存放在內(nèi)存棧區(qū) stackBlock
eg:
- (void)stackBlockTest {
NSString *str = @"hello";
NSLog(@"%@", ^(){
? ? ? NSLog(@"%@", str);
? ? });
}
輸出: <__NSStackBlock__: 0x7ffeef2e1480>
3.若聲明一個block屬性,并且定義該block
eg:
- (void)mallocBlockTest {
//1.若沒有引用block外部的局部變量,block存放在內(nèi)存的數(shù)據(jù)區(qū)域(.data區(qū)域)GlobalBlock
self.block = ^(){
NSLog(@"hello world...");
};
輸出: <__NSGlobalBlock__: 0x1047390f0>
//2.若block引用了外部的局部變量包晰,block被拷貝到堆區(qū) mallocBlock
NSString *str = @"hello world";
self.block = ^(){
NSLog(@"%@", str);
};
輸出: <__NSMallocBlock__: 0x608000246870>
}
二湿镀、若block引用全局的變量炕吸,則block存放在數(shù)據(jù)區(qū)域(.data區(qū)域)GlobalBlock
eg:
@property(noatomic, copy) NSString str;
- (void)testBlock {
self.str = @"hello world";
self.block = ^() {
NSLog(@"%@",self.str);
};
NSLog(@"%@", self.block);
NSLog(@"%@", ^() {
NSLog(@"%@",self.str);
});
輸出: <__NSGlobalBlock__: 0x104880128>
? <__NSGlobalBlock__: 0x1048800e8>
}