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仍旧是强指针。这样一个是弱的便解决问题了。
#import "ViewController.h"
typedef void(^MyBlock)();
@interface ViewController ()
@property (nonatomic,copy) MyBlock block;
@property (nonatomic,copy) NSString *name;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
__weak typeof(self) weakself = self;
self.block = ^{
weakself.name = @"block";
};
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end