- block的變量傳遞
如下例子分別聲明一個局部變量、一個__block修飾的局部變量秩命、一個靜態(tài)變量和一個全局變量尉共,并且初始的值為1褒傅,在block中打印外部的值,而且在該block過去之后改變前面聲明的變量值袄友。如下:
@implementation ViewController
int param = 4;
- (void)viewDidLoad {
[super viewDidLoad];
int param1 = 1;
static int param2 = 1;
__block int param3 = 1;
_block = ^{
NSLog(@"%s----%d-%d-%d-%d",__func__,param, param1,param2,param3);
};
param = 2;
param1 = 2;
param2 = 2;
param3 = 2;
_block();
}
-[ViewController viewDidLoad]_block_invoke----2-1-2-2
打印日志如下殿托,除了局部變量是1外其他都是2,在block中除了局部變量是傳遞外剧蚣,其他的都是指針傳遞支竹。
- MRC中沒有強指針和弱指針的概念,所有屬性都是基本數(shù)據(jù)類型券敌,基本數(shù)據(jù)類型都放在棧里面
在block內(nèi)部使用外部指針且會造成循環(huán)引用情況下,需要用weak修飾外部指針 weak typeof(self) weakSelf = self;
如例子block造成循環(huán)引用:Block會對其塊里面的所有外部強指針變量變量全部引用一次唾戚。
#import "modelViewController.h"
@interface modelViewController ()
@property (nonatomic,strong) void(^block)();
@end
@implementation modelViewController
- (void)viewDidLoad {
[super viewDidLoad];
int param = 1;
_block = ^{
NSLog(@"%@", self);
};
param = 2;
}
警告會出現(xiàn)retain cycle即循環(huán)引用
問問
- 在block內(nèi)部如果調(diào)用了延時函數(shù)還使用弱指針會取不到該指針,因為已經(jīng)被銷毀了,需要在block內(nèi)部再將弱指針重新強引用一下__strong typeof(self) strongSelf = weakSelf;如一下代碼:
__weak typeof(self) weakSelf = self;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 *
NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"%@", weakSelf);
});
- 如果需要在block內(nèi)部改變外部變量的話,需要在用__block修飾外部變量
int param = 1;
void goToWork(WorkBlock workBlock)
{
NSLog(@"%d", param);
}
//上面的結(jié)果是1
通過上面的block可以看出在block中訪問外面的的變量是沒有問題的,但是直接修改外面的變量的值是會報錯的待诅,如下param = 2叹坦;
會報錯。
void goToWork(WorkBlock workBlock){
param = 2卑雁;
NSLog(@"%d", param);
}
所以在修改block外部變量的值之前需要在前面加__block;
待補充...