iOS MRC 下 block 循环引用问题实例讲解
下面一段代码给大家介绍iOSMRC下block循环引用问题
//注意此__block会复制一份指针出来一次原始的指针如果置为nil的话,此处复制出来的指针还是野指针 __block__typeof(self)weakSelf=self; //__weak__typeof(self)weakSelf=self; //__weakPerson*weakSelf=self; void(^block)(void)=^(void){ //NSLog(@"name-->is%@",self.name); //NSLog(@"name-->is%@",weakSelf.name); //这样判断会crash此时weakSelf为野指针 //weakSelf这时候是个野指针。。。野指针也是指针对吧?反正,这个野指针并不为NULL,虽然它指向的内存并未有什么鸟用, //然而代码并不知道。所以执行[weakSelfdoSomething];必然闪退。 //注意此__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 // //Createdbyjeffasdon2017/12/1. //Copyright©2017年jeffasd.Allrightsreserved. // #import"ViewController.h" #import"Person.h" @interfaceViewController() @property(nonatomic,copy)NSString*name; @end @implementationViewController -(void)viewDidLoad{ [superviewDidLoad]; self.view.backgroundColor=[UIColorwhiteColor]; self.name=@"xiaoming"; } -(void)touchesBegan:(NSSet*)toucheswithEvent:(UIEvent*)event{ self.view.backgroundColor=[UIColorcyanColor]; //void(^block)(void)=^(void){ //NSLog(@"name-->is%@",self.name); //}; // // // //for(inti=0;i<30;i++){ //block(); //} Person*xiaoming=[[Personalloc]init]; //[xiaomingretain]; [xiaomingrelease]; //xiaoming=nil; xiaoming=NULL; } -(void)didReceiveMemoryWarning{ [superdidReceiveMemoryWarning]; //Disposeofanyresourcesthatcanberecreated. } @end
// //Person.m //test_mrc_block_self_01 // //Createdbyjeffasdon2017/12/1. //Copyright©2017年jeffasd.Allrightsreserved. // #import"Person.h" #include@interfacePerson() @property(nonatomic,copy)NSString*name; @end @implementationPerson -(instancetype)init{ if(self=[superinit]){ self.name=@"xiaoming"; //注意此__block会复制一份指针出来一次原始的指针如果置为nil的话,此处复制出来的指针还是野指针 __block__typeof(self)weakSelf=self; //__weak__typeof(self)weakSelf=self; //__weakPerson*weakSelf=self; void(^block)(void)=^(void){ //NSLog(@"name-->is%@",self.name); //NSLog(@"name-->is%@",weakSelf.name); //这样判断会crash此时weakSelf为野指针 //weakSelf这时候是个野指针。。。野指针也是指针对吧?反正,这个野指针并不为NULL,虽然它指向的内存并未有什么鸟用, //然而代码并不知道。所以执行[weakSelfdoSomething];必然闪退。 //注意此__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(inti=0;i<300;i++){ //dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{ //block(); //}); dispatch_async(dispatch_get_main_queue(),^{ block(); }); } } returnself; } @end
总结
以上所述是小编给大家介绍的iOSMRC下block循环引用问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!