IOS内存泄露

  App里的内存泄漏分为两类: Leaked memory: Memory unreferenced by your application that cannot be used again or freed (also detectable by using the Leaks instrument). Abandoned memory: Memory still referenced by your application that has no useful purpose. 利用XCode自带的Instrument,  可以分析出这些内存泄漏。 根据笔者的经验,Leaked memory能分析的是这样的一类内存泄漏: memAlloc = malloc(100); 当memAlloc没有被释放,此语句再次被执行的时候就会被Instruments的Leak工具检测出来。 麻烦的内存泄漏是Abandoned memory,这类内存一直被缓存,但其实已经没有用了,问题来了,什么是有用,什么是没用呢? Instrument工具给出的方案是https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/FindingAbandonedMemory.html#//apple_ref/doc/uid/TP40004652-CH80-SW1, 简单来说,用 Mark Generation 的方式,每次Mark的时候,都会生存一个内存快照,然后比较两个快照有什么不同。可想而知,这个是对稍微复杂点的场景来说,还是太不方便。 对于游戏来说,主要的消耗内存的就是纹理和音视频资源了,这一块除了设计好资源管理外,需要提供一个直观方便的dump info,随时能够查看资源分配和释放的情况。然后配合Instrument的工具,也足够使用了。 更高级的内存泄漏,依然是利去hook底层的内存分配和释放函数,IOS方面的内存泄漏可以参考: https://wereadteam.github.io/2016/02/22/MLeaksFinder/

Java中的字符编码

今天在接入某邻国的支付SDK的时候,碰上了一个乱码问题。 直接表现是,从数据库后台返回给前端网页上的中文及邻国文字都变成了问号,英文没有问题。 分析了一下,我们的数据库是采用UTF-8字符集的,new String(“dataValueXXX”, “UTF-8”)应该是没有问题的,于是设置了response.setContentType(“application/json;charset=UTF-8”);一切就OK了。 其实问题的根本主要是理解下Java的String是怎么处理字符集问题的。 记录一笔,只是感慨时光流逝,当年读书的时候做些项目也碰到过类似的问题,总觉得那时候一知半解还挺折腾,时光流逝,回过头去,看看文档,再想一想,看的明白点了。

Supporting IPv6 DNS64/NAT64 Networks

从6月1日起,苹果审核要求支持IPv6 DNS64/NAT64网络了。 我们服务器和客户端都是Socket编程,IPv4地址。最后参照https://developer.apple.com/library/mac/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html#//apple_ref/doc/uid/TP40010220-CH213-SW1,在客户端处理下即可。 需要说明的是, 在上述文档Apple给出的Listing 10-1  Using getaddrinfo to resolve an IPv4 address literal中,error = getaddrinfo(ipv4_str, “http”, &hints, &res0); 经测试,在IOS下,第一个参数为IPv4地址的情况下,第二个参数为http,ftp等常用字符串,服务器此时监听端口需改为协议默认端口才可能;或者第一个参数为域名,第二个参数为数字端口; 不支持第一个参数为IPv4地址,第二个参数为数字端口。坑爹。有两种方法解决这个问题 : 1) 域名+数字端口。 2) 先getaddrinfo, 再获取sockaddr_in或者sockaddr_in6,设置sin_port或sin6_port。 关于IPv6,可以参考下几篇文章: https://tools.ietf.org/html/rfc4038 https://github.com/WeMobileDev/article/blob/master/IPv6%20socket编程.md

UNABLE_TO_GET_ISSUER_CERT_LOCALLY

可能是苹果最近更新一些安全性的问题,我们的服务器收据验证(用的是openssl 的BIO相关接口)突然不好使了。 SSL_get_verify_result函数返回X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY错误。 去https://curl.haxx.se/docs/caextract.html这里下载了一个最新的证书,替换掉SSL_CTX_load_verify_locations使用的旧证书,OK了。

http的post multipart/form-data

最近接入某android支付系统时,对方post过来一段数据,java里用HttpServletRequest request的getParameter怎么也获取不出来参数。 重新一字一句地看了下支付文档,post里捎带说明了下post multipart/form-data格式。果不其然, request.getParameter是无法获取出来参数的。 google一下,很快解决了问题。 常见的Content-Type还有application/x-www-form-urlencoded; application/json;application/pdf等。