很久很久以前

刚从业时,是做Java后端的
我们知道Integer是int的包装类,2个int类型的值是可以通过a == b来进行比较的
于是想当然以为Integer也是可以这么比较

一次事故就要开始

一个简单的充值验证,需要比较充值数额是否相等,用的Integer类
我们测试的时候用的是1块钱(10金币),比较金币拿了2个Integer来做==判断
10金币顺利通过测试,100金币也是,随之上线

事故的爆发

产品上线后,从后台查询发现,只有10金币和100金币的充值记录(但按经验看来是不合理的)
也有玩家陆续反应100块(1000金币)充值失败

原因

Java中<128的Integer取的是常量,内存地址是一样的,>=128时,则是重新开辟了一块内存
又因为==是比较内存地址用的,比较值相等应该用a.equals(b)

测试代码

输出

问题的出现

iOS 项目中使用了MJRefresh,在 xcode6中使用 objc_msgSend 会报错Too many arguments to function call…

解决方案

在 Building Setting 下Apple LLVM 6.1 – Preprogressing下的Enable Strict Checking of objc_msgSend Calls设置成No

吐槽

苹果每次升级 xcode/iOS 都会出现一堆不兼容,然后你又可以通过设置某个值再去兼容,简直是 x 裤子放 y,像 arc 的编译参数之类的,自动判断一下啊… 恩 吐槽好了就舒服了

FMDB

全称FMDatabase,是一个用Objective-C写的sqlite封装

下载

可以通过github下载源码包,复制src/fmdb/下所有文件到项目目录下
也可以通过CocoaPods,添加pod 'FMDB'到配置文件中

代码

在Swift项目中添加Objective-C代码,会提示添加Bridgging-Header
在Bridgging-Header.h中添加#include "FMDB.h"就像写C的头文件那样
然后Swift里就可以用FMDB的所有类了

获取DB

添加数据

删除数据

查找数据

Enjoy it!

找回了一点写后端的感觉,呕吼吼吼

需求的产生

公司外网传内网的文件上传有大小限制,如今有一个数G的文件要传到内网去
环境:外网Mac,内网Windows

分包压缩

首先想到的是分包压缩,Mac下用BetterZip分卷压缩成xxx.zip.001~xxx.zip.014
内网用WinRAR解压,我凑,后缀为001的RAR不认识,直接打开告诉我压缩文件已损坏
心想分包解压可能是有一个固定的命名格式,另辟蹊径吧

文件分割

mac下有个命令 split
用如下命令可以将文件分割成100MB/个的小文件,分割后的文件叫 file.exe.aa file.exe.ab …

文件合并

windows下用copy命令就可以轻松的合并文件

Enjoy it!

问题的产生

项目是用ccs1.6做的UI,在某个需求中,需要把一个Sprite的SpriteFrame clone一份,去构造另一个
代码类似于

这样并没有问题
但是如果sprite的SpriteFrame被set过一个新的,那sprite2得到的SpriteFrame,依然是老的

怎么回事?

查看源码,我们发现Node:clone()方法被重写了(在NodeEx.lua里)

粗读一下代码,先克隆一个实例,然后克隆基础属性,最后递归把子节点也克隆了

那问题就应该出现在self:createCloneInstance_()上
查阅发现

好吧…直接用构造参数返回一个实例是什么鬼

既然出事了,就弄弄大

我们发现所有UI组件的createCloneInstance_方法都有这个问题
写一段比较简单的代码

 
可以看到,屏幕上显示label显示after,label2显示before

如果不用UI组件呢?

我试了一下,直接使用Sprite和LabelTTF是没有问题的,那这个就可以定性为quick的bug了

懒加载

我最先接触懒加载(延时加载)是在Hibernate里,因为一次和数据库交互过多,导致应用程序卡顿,所以就延迟加载这些数据,等需要的时候再取.可以认为懒加载就是非即时的加载数据.

 

问题的产生

在游戏开发中,也会碰到一次处理太多数据造成游戏卡顿降帧,比较典型的比如”背包”模块,背包可以认为是一个ListView,由一个lua table里的一些元素作为数据源来构建,当用一个for循环去构造界面时,背包格子过多会导致游戏线程卡住,游戏降帧在所难免.如何做到不降帧?我们可以把一个复杂的逻辑分在多个帧里去做.

 

来看看代码

用法

Github

戳这里

3D时代

当Unity3D开始支持2D的时候Cocos2d-x也开始慢慢支持3D

Cocos2d-x的3D

使用下来一是不习惯,二是问题比较多,比较明显的,就是模型在运动时白边比较严重

开启抗锯齿

找到项目的AppController.mm文件
在didFinishLaunchingWithOptions方法中将

替换成

模型白边的问题就好很多了