創(chuàng)建工程:,先來(lái)一段簡(jiǎn)單的代碼:
#import "ViewController.h"
@interface ViewController ()
// 1.聲明block
@property (nonatomic,copy) void(^MyBlock)();
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 2.定義block
self.MyBlock = ^{
NSLog(@"%@",self.view);
};
// 3.執(zhí)行block
self.MyBlock();
}
@end
這時(shí)Xcode會(huì)直接給予提示:
循環(huán)引用提示.png
提示我們產(chǎn)生了循環(huán)引用:
self.Myblock --> 當(dāng)前控制器對(duì)block產(chǎn)生強(qiáng)引用
self.view -->block對(duì)self(當(dāng)前控制器)產(chǎn)生強(qiáng)引用
解決辦法就是使用__weak修飾
#import "ViewController.h"
@interface ViewController ()
// 1.聲明block
@property (nonatomic,copy) void(^MyBlock)();
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
__weak typeof(self) weakSelf = self;
// 2.定義block
self.MyBlock = ^{
NSLog(@"%@",weakSelf.view);
};
// 3.執(zhí)行block
self.MyBlock();
}
@end
參考鏈接:http://www.reibang.com/p/011bd4b8df7b
接下來(lái)對(duì)UI視圖進(jìn)行一些調(diào)整,進(jìn)一步演示Block使用時(shí)的一些細(xì)節(jié)
1.嵌入導(dǎo)航控制器
2.點(diǎn)擊導(dǎo)航控制器的根控制器的RightBarButtonItem,跳轉(zhuǎn)到之前的ViewController控制器
UI.png
3.在ViewController中重寫Dealloc方法
4.在定義Block的內(nèi)部,打印兩次self.view,并在兩次打印中間添加一個(gè)2s的延遲
改動(dòng)代碼后:
#import "ViewController.h"
@interface ViewController ()
// 1.聲明block
@property (nonatomic,copy) void(^MyBlock)();
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 解決Block內(nèi)部循環(huán)引用
__weak typeof(self) weakSelf = self;
// 2.定義block
self.MyBlock = ^{
/*
從Xcode 7.3開始,包括操作系統(tǒng)一旦升級(jí)后,就不需要強(qiáng)弱引用!
而在之前的版本中的寫法為:
__strong typeof(weakSelf) strongSelf = weakSelf;
if(strongSelf){
NSLog(@"%@",strongSelf);
[NSThread sleepForTimeInterval:2];
NSLog(@"%@",strongSelf);
}
因?yàn)槭褂胈_weak修飾的對(duì)象,隨時(shí)可能會(huì)被銷毀,在之前版本中,如果不使用強(qiáng)引用,第二段打印代碼結(jié)果就可能為nil
這也就是weak-strong dance的使用場(chǎng)景
*/
NSLog(@"%@",weakSelf.view);
[NSThread sleepForTimeInterval:2];
NSLog(@"%@",weakSelf.view);
};
// 3.異步執(zhí)行block
dispatch_async(dispatch_get_global_queue(0, 0), ^{
self.MyBlock();
});
}
- (void)dealloc{
NSLog(@"%s",__func__);
}
@end
因?yàn)槭褂玫氖荴code 7.3,所有成功打印出結(jié)果:
2016-08-12 12:04:30.573 Block擴(kuò)展[3415:436303] <UIView: 0x7ff02363b030; frame = (0 0; 414 736); autoresize = W+H; layer = <CALayer: 0x7ff023634320>>
2016-08-12 12:04:32.577 Block擴(kuò)展[3415:436303] <UIView: 0x7ff02363b030; frame = (0 0; 414 736); autoresize = W+H; layer = <CALayer: 0x7ff023634320>>
2016-08-12 12:04:32.577 Block擴(kuò)展[3415:436260] -[ViewController dealloc]
weak-strong dance也是開發(fā)中需要注意的一個(gè)block使用的技巧,而更嚴(yán)謹(jǐn)一點(diǎn)的寫法應(yīng)該是:
__strong typeof(weakSelf) strongSelf = weakSelf;
if(strongSelf){
NSLog(@"%@",strongSelf);
[NSThread sleepForTimeInterval:2];
NSLog(@"%@",strongSelf);
}
但隨著Xcode 7.3更新,已經(jīng)為我們避免了這個(gè)問(wèn)題,直接使用__weak就可以了