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循环引用问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!