时间:2021-05-20
下面一段代码给大家介绍iOS MRC 下 block 循环引用问题
//注意此__block会复制一份指针出来 一次原始的指针如果置为nil的话,此处复制出来的指针还是野指针 __block __typeof(self)weakSelf = self; //__weak __typeof(self)weakSelf = self; //__weak Person *weakSelf = self; void (^block)(void) = ^(void){ //NSLog(@"name --> is %@", self.name); //NSLog(@"name --> is %@", weakSelf.name); //这样判断会crash 此时weakSelf为野指针 //weakSelf 这时候是个野指针。。。野指针也是指针对吧?反正,这个野指针并不为NULL,虽然它指向的内存并未有什么鸟用, //然而代码并不知道。所以 执行[weakSelf doSomething]; 必然闪退。 //注意此__block会复制一份指针出来 一次原始的指针如果置为nil的话,此处复制出来的指针还是野指针 // if (weakSelf) { // NSLog(@"name --> is %@", weakSelf.name); // } //malloc(22); // malloc_zon //这并没有什么卵用。。。weakSelf 已经是野指针 照样crash // __strong __typeof(weakSelf) strongSelf = weakSelf; // if (weakSelf) { // NSLog(@"name --> is %@", strongSelf.name); // } if (malloc_zone_from_ptr(weakSelf)) { NSLog(@"name --> is %@", weakSelf.name); } // // ViewController.m // test_mrc_block_self_01 // // Created by jeffasd on 2017/12/1. // Copyright © 2017年 jeffasd. All rights reserved. // #import "ViewController.h" #import "Person.h" @interface ViewController () @property (nonatomic, copy) NSString *name; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor whiteColor]; self.name = @"xiaoming"; } - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ self.view.backgroundColor = [UIColor cyanColor]; // void (^block)(void) = ^(void){ // NSLog(@"name --> is %@", self.name); // }; // // // // for (int i = 0; i < 30; i++) { // block(); // } Person *xiaoming = [[Person alloc] init]; //[xiaoming retain]; [xiaoming release]; // xiaoming = nil; xiaoming = NULL; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end // // Person.m // test_mrc_block_self_01 // // Created by jeffasd on 2017/12/1. // Copyright © 2017年 jeffasd. All rights reserved. // #import "Person.h" #include <malloc/malloc.h> @interface Person () @property (nonatomic, copy) NSString *name; @end @implementation Person - (instancetype)init{ if (self = [super init]) { self.name = @"xiaoming"; //注意此__block会复制一份指针出来 一次原始的指针如果置为nil的话,此处复制出来的指针还是野指针 __block __typeof(self)weakSelf = self; //__weak __typeof(self)weakSelf = self; //__weak Person *weakSelf = self; void (^block)(void) = ^(void){ //NSLog(@"name --> is %@", self.name); //NSLog(@"name --> is %@", weakSelf.name); //这样判断会crash 此时weakSelf为野指针 //weakSelf 这时候是个野指针。。。野指针也是指针对吧?反正,这个野指针并不为NULL,虽然它指向的内存并未有什么鸟用, //然而代码并不知道。所以 执行[weakSelf doSomething]; 必然闪退。 //注意此__block会复制一份指针出来 一次原始的指针如果置为nil的话,此处复制出来的指针还是野指针 // if (weakSelf) { // NSLog(@"name --> is %@", weakSelf.name); // } //malloc(22); // malloc_zon //这并没有什么卵用。。。weakSelf 已经是野指针 照样crash // __strong __typeof(weakSelf) strongSelf = weakSelf; // if (weakSelf) { // NSLog(@"name --> is %@", strongSelf.name); // } if (malloc_zone_from_ptr(weakSelf)) { NSLog(@"name --> is %@", weakSelf.name); } }; for (int i = 0; i < 300; i++) { // dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // block(); // }); dispatch_async(dispatch_get_main_queue(), ^{ block(); }); } } return self; } @end总结
以上所述是小编给大家介绍的iOS MRC 下 block 循环引用问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
IOS避免self循环引用的方法的实例详解示例代码://-weak&strong#definemyWeakify(VAR)\try{}@finally{}\__
想要在excel中使用循环引用公式,如何使用呢?下面讲解excel如何使用循环引用公式。一起来看看吧。 1、如图所示单元格在引用自身的时候,出现循环引用警
内存管理中经常会遇到的一个问题便是循环引用。首先,我们来了解一下iOS是如何进行内存管理的。和OC一样,swift也是使用自动引用计数ARC(AutoRefer
IOS常见的循环引用总结介绍:循环引用,指的是多个对象相互引用时,使得引用形成一个环形,导致外部无法真正是否掉这块环形内存。其实有点类似死锁。举个例子:A->B
看过一次spring公开课,记录一下bean的循环引用问题。问题:publicclassIndexService{ @Autowired IndexDaoi