<h1> 1什么是Blocks?
<h6>Block 是C語言的擴充功能,簡單來講就是帶有自動變量(局部變量)的匿名函數(shù).
/
<h1>2Block的定義格式(語法)
<h6>返回值類型(^block變量名)(形參列表) = ^(形參列表) {
};
調(diào)用Block保存的代碼
block變量名(實參);
例如:
無參無返回值的BLock
void (^myBlock1)() = ^(){
NSL(@"我是一個無參無返回值的Block");
myBlock1();
}
有參無返回值的Block
void (^myBlock2)(int , int) = ^(int a, int b){
NSLog(@"%d" + @"%d" = @"%d",a , b, a+b);
}
myBlock(3,4);
有參有返回值Block
NSString *(^myBlock3)(NSString *,NSString *) = ^(NSS
trying *str1,NSString *str2){
return [NSString stringWithFormat:@"%@__%@",str1,str2];
NSString *str1 = @"暴躁的";
NSString *str2 = @"BLOCK";
myBlock3(str1,str2);
}
<h1>3Block 與 typedef的完美結(jié)合
<h6>由于Block的語法格式過于繁雜,所以為了我們在工作中更加方便的使用,通常我們會使用typedef對Block進行重定義.
舉個例子:
新建兩個視圖控制器 ViewController1和ViewController2
通過點擊ViewController1跳入ViewController2,然后在ViewController2中觸發(fā)回調(diào)Block,返回ViewController1并修改ViewController的背景顏色;
代碼如下:ViewController2
#import<UIKit/UIKit.h>
@interface ViewController2 : UIViewController
typedef void(^changeColor)(id);
@property (nonatomic, copy) changeColor backgroundColor;
@end
- (void)touchesBegan:(NSSet<UITouch *> *)touchs withEvent:(UIEvent *)event{
self.backgroundColor([UIColor redColor]);
}
viewController的實現(xiàn)
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent{
ViewController2 *vc = [viewController2 new];
vc.backgroundColor = ^(UIColor *color){
self.view.background = color;
};
[self.navigationController pushViewController:vc animated: YES];
}
<h1>4.Block的內(nèi)存管理
<h6>1.在Block里面引用一個局部的OC對象的時候彬犯,該對象會被retain皇忿;
2.如果局部的變量使用__block修飾沫换,則不會被retain卵洗;
3.在Block里面引用一個實例變量時夸赫,該實例對象會被retain;
4.Block本身可以像對象一樣copy和release络它;
5.Block創(chuàng)建后內(nèi)存是分配在棧上族檬,調(diào)用copy方法,會將Block從棧移到堆上化戳;
6.當Block聲明為全部變量時单料,我們應該就調(diào)用Block的copy方法
<h1>5循環(huán)引用
<h6>block代碼塊里用到的東西,比如主線程里的全局變量,局部變量看尼,UI等递鹉,block都會對它指向一個strong指針。也就是說藏斩,局部變量所在的局部代碼運行完后躏结,局部變量不會釋放,直到block消失狰域,它才釋放媳拴。
這個不太好,這樣如果block代碼里面有self.something兆览,而block又存儲在strong的全局變量里屈溉,會導致block對self一個strong指針,self對block又有一個strong指針抬探,就導致了memory circle子巾。相應的解決辦法是: __weak MyClass *weakself = self;
使得block指向self一個弱指針。self指向block仍舊是強指針小压。這樣一個是弱的便解決問題了