当前位置: 移动技术网 > IT编程>移动开发>IOS > iOS MRC 下 block 循环引用问题实例讲解

iOS MRC 下 block 循环引用问题实例讲解

2019年07月24日  | 移动技术网IT编程  | 我要评论

高危险游戏,粉红色的火烈鸟qvod,龙族3黑月之潮全文阅读

下面一段代码给大家介绍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 循环引用问题,希望对大家有所帮助

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

  • ios uicollectionview实现横向滚动

    现在使用卡片效果的app很多,之前公司让实现一种卡片效果,就写了一篇关于实现卡片的文章。文章最后附有demo实现上我选择了使用uicollectionview ... [阅读全文]
  • iOS UICollectionView实现横向滑动

    本文实例为大家分享了ios uicollectionview实现横向滑动的具体代码,供大家参考,具体内容如下uicollectionview的横向滚动,目前我使... [阅读全文]
  • iOS13适配深色模式(Dark Mode)的实现

    iOS13适配深色模式(Dark Mode)的实现

    好像大概也许是一年前, mac os系统发布了深色模式外观, 看着挺刺激, 时至今日用着也还挺爽的终于, 随着iphone11等新手机的发售, ios 13系统... [阅读全文]
  • ios 使用xcode11 新建项目工程的步骤详解

    ios 使用xcode11 新建项目工程的步骤详解

    xcode11新建项目工程,新增了scenedelegate这个类,转而将原appdelegate负责的对ui生命周期的处理担子接了过来。故此可以理解为:ios... [阅读全文]
  • iOS实现转盘效果

    本文实例为大家分享了ios实现转盘效果的具体代码,供大家参考,具体内容如下demo下载地址: ios转盘效果功能:实现了常用的ios转盘效果,轮盘抽奖效果的实现... [阅读全文]
  • iOS开发实现转盘功能

    本文实例为大家分享了ios实现转盘功能的具体代码,供大家参考,具体内容如下今天给同学们讲解一下一个转盘选号的功能,直接上代码直接看viewcontroller#... [阅读全文]
  • iOS实现轮盘动态效果

    本文实例为大家分享了ios实现轮盘动态效果的具体代码,供大家参考,具体内容如下一个常用的绘图,主要用来打分之类的动画,效果如下。主要是ios的绘图和动画,本来想... [阅读全文]
  • iOS实现九宫格连线手势解锁

    本文实例为大家分享了ios实现九宫格连线手势解锁的具体代码,供大家参考,具体内容如下demo下载地址:效果图:核心代码://// clockview.m// 手... [阅读全文]
  • iOS实现卡片堆叠效果

    本文实例为大家分享了ios实现卡片堆叠效果的具体代码,供大家参考,具体内容如下如图,这就是最终效果。去年安卓5.0发布的时候,当我看到安卓全新的material... [阅读全文]
  • iOS利用余弦函数实现卡片浏览工具

    iOS利用余弦函数实现卡片浏览工具

    本文实例为大家分享了ios利用余弦函数实现卡片浏览工具的具体代码,供大家参考,具体内容如下一、实现效果通过拖拽屏幕实现卡片移动,左右两侧的卡片随着拖动变小,中间... [阅读全文]
验证码:
移动技术网