爬坑笔记

引子

  游戏开发过程中遇坑在所难免,没遇到的话基本上也是因为爬的不够远不够深罢了,近日自己便遇到一坑,虽小但又觉的挺微妙(subtle),在此一记~

问题

  按钮点击事件的重复触发问题:项目目前使用NGUI,逻辑中创建了一个按钮B1,并绑定了点击委托D1,D1中的处理逻辑则是销毁按钮B1并创建一个新的按钮B2,并绑定新按钮的点击委托为D2

  伪代码表示一下大概是这个样子:

  // here B1 is UIButton
 B1.onClick.Add(new EventDelegate(D1));
            
 // B1 button click delegate
 void D1()
 {
     DestroyButton(B1);
     var B2 = CreateButton();
     B2.onClick.Add(new EventDelegate(D2));
 }
            
 // B2 button click delegate
 void D2()
 {
     // some logic here
 }

  一开始朴素的实现方式下,世界很平静,一切很正常,点击B1触发了D1:销毁B1并新创建了B2,后来尝试优化了一把,思路还是借鉴对象池:既然B1和B2都是按钮,那就不必执行销毁再创建的流程,直接复用B1即可,只是需要改变一下B1的点击委托,伪代码大概是这个样子:

  // here B1 is UIButton
  B1.onClick.Add(new EventDelegate(D1));
			
  // B1 button click delegate
  void D1()
  {
      B1.onClick.Clear();
      B1.onClick.Add(new EventDelegate(D2));
  }
			
  // B2 button click delegate
  void D2()
  {
      // some logic here
  }

  想法挺美好,但是事实往往很残酷,如此修改之后,点击B1的确触发了D1,但是同时也触发了D2,WTF?

  尝试跟踪了一下执行流程,定位了原因:

  以上便是NGUI处理回调委托的大致代码,我们之前注册的D1会在红框标示部分执行,这里我们执行了回调委托的重置(将D1删除,并添加了D2),进而导致执行了黑框部分的代码,于是D2“莫名其妙”的被触发了……

  说来这个问题其实跟列表元素的删除类似,有兴趣的朋友可以看看之前的一篇~

  就这样了~

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏向治洪

ECMAScript 6 入门简介

ECMAScript 6.0(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了。它的目标,是使得JavaScript语言...

1977
来自专栏生信宝典

别人的电子书,你的电子书,都在bookdown

bookdown是著名R包作者谢益辉开发的,支持采用Rmarkdown (R代码可以运行)或普通markdown编写文档,然后编译成HTML, WORD, PD...

48611
来自专栏IT派

用Click编写Python命令行工具

在编写Python命令行(CLI)应用程序时,使用Click库进行参数解析的深入教程

2141
来自专栏北京马哥教育

通过IP获取地理位置信息的几种方式

1、QQWry IP纯真数据库 纯真版IP地址数据库是当前网络上最权威、地址最精确、IP记录以及网吧数据最多的IP地址数据库。收集了包括中国电信、中国移动、中...

5415
来自专栏Spark学习技巧

Kafka源码系列之副本同步机制及isr列表更新

一,基本思路 <Kafka源码系列之Consumer高级API性能分析>读过这篇文章的同学必然会对本篇文件较为熟悉,因为该篇讲的副本同步,实际上也是基于Simp...

8866
来自专栏闰土大叔

记一次前端大厂面试

链接:https://juejin.im/post/5b9770056fb9a05d2f3692ce

2397
来自专栏贾鹏辉的技术专栏@CrazyCodeBoy

Android Studio 2.2新特性:新布局、Firebase、OpenJDK以及Java 8

尊重版权,未经授权不得转载 本文出自:贾鹏辉的技术博客(http://www.devio.org) 前几天,收到了Android Studio 2.2的...

3454
来自专栏landv

c语言_代码段_快说你是猪

4463
来自专栏即时通讯技术

金蝶随手记团队分享:还在用JSON? Protobuf让数据传输更省更快(实战篇)

本文接上篇《金蝶随手记团队分享:还在用JSON? Protobuf让数据传输更省更快(原理篇)》,以iOS端的Objective-C代码为例,向您演示如何使用P...

912
来自专栏Java3y

AJAX入门这一篇就够了

什么是Ajax Ajax(Asynchronous JavaScript and XML) 异步JavaScript和XML Ajax实际上是下面这几种技术的融...

1.3K8

扫码关注云+社区

领取腾讯云代金券