开发了一个app, 在debug模式下没有任何问题,在release模式下就直接崩溃.

经过一段时间的定位终于定位到如下的这一段代码:

    E_BZ_TestType type = [dic[@"type"] integerValue];
   // 调用代码
self.sourceLabel.text = [NSString stringWithFormat:@"%@", NSStringFromE_BZ_TestType(type)];

其中枚举定义和枚举翻译中文定义如下:

// 枚举  在一个 XXDefine.h中
typedef NS_ENUM(NSInteger, E_BZ_TestType) {
kE_BZ_TestType_None = ,
kE_BZ_TestType_One = ,
};
// 翻译函数定义
NSString *NSStringFromE_BZ_TestType(E_BZ_TestType type); // 翻译函数实现 在一个 XXDefine.m中
NSString *NSStringFromE_BZ_TestType(E_BZ_TestType type)
{
switch (type) {
case kE_BZ_TestType_None:
return @"没有";
case kE_BZ_TestType_One:
return @"一";
default:
break;
}
}

注意上面的代码:

1. 代码不在任何类内部

2. 翻译函数的  default  是break, 没有返回任何值.

3. 在debug/Release 模式下, 翻译函数没有产生任何错误和任何警告

对于注意 第3条 如果把翻译函数实现改成如下就会出现错误

NSString *NSStringFromE_BZ_TestType(E_BZ_TestType type)
{
switch (type) {
case kE_BZ_TestType_None:
return @"没有";
default:
break;
}
}

那么现在 问题来了:

当在调用代码中 type 不属于枚举中的任何一个的时候,例如type = 100

在使用翻译函数的时候:

DEBUG 模式是: 返回了100字符串

而在 RELEASE模式是 直接崩溃了

所以只能把翻译函数修改如下:

NSString *NSStringFromE_BZ_TestType(E_BZ_TestType type)
{
switch (type) {
case kE_BZ_TestType_None:
return @"没有";
case kE_BZ_TestType_One:
return @"一";
default:
return @"未知";
}
}

这样 就不会出现问题了.

我想这是 Release 模式代码优化导致的结果

iOS enum C方法 DEBUG, RELEASE的隐藏的一个坑的更多相关文章

  1. iOS关于沙盒文件拷贝manager.copyItem的一个坑

    记录一下: 沙盒文件操作,当需要拷贝文件时,我们可以使用如下类似方式: // 文件拷贝 func copyFile(from:String,to:String)->Bool{ if !manag ...

  2. [iOS开发系列]根据Debug和Release状态的变化来屏蔽日志输出

    今天在这里分享一个很实用的小技巧. 我们平时在开发应用的时候,经常会用到NSLog来调试我们的程序,而随着项目越来越大,这些用于调试的日志输出就会变得很难管理. 我们在发布正式版的时候一定要屏蔽掉所有 ...

  3. iOS调试程序的方法

    IOS各种调试技巧豪华套餐 普通操作 如图3 基本的断点操作如下 图4 点击那个黑列列就创建了一个断点,再次点击就临时取消这个断点(但是不删除),长按那个断点拖出去就删除了(mac os的系统工程师就 ...

  4. iOS常用公共方法

      iOS常用公共方法 字数2917 阅读3070 评论45 喜欢236 1. 获取磁盘总空间大小 //磁盘总空间 + (CGFloat)diskOfAllSizeMBytes{ CGFloat si ...

  5. Unity3D与iOS消息交互方法(1)--iOS接收Unity3D发出的消息

    跨平台这种事情不管多NB, 总要有些与原生系统交互的方法, 比如  Unity3D与iOS消息交互方法. 一: 建立一个空的Unity工程. File -->  New Project 二: 编 ...

  6. iOS 常用公共方法

    iOS常用公共方法 1. 获取磁盘总空间大小 //磁盘总空间 + (CGFloat)diskOfAllSizeMBytes{ CGFloat size = 0.0; NSError *error; N ...

  7. 你遗忘的都在这里—iOS常用类型方法笔记

    这些都是项目中常用但又常忘的方法,与大家分享一下. 一.NSString 创建字符串.  NSString *astring = @"This is a String!"; 创建空 ...

  8. 关于 Enum.TryParse 方法的一个小坑…

    今天在测试导入数据的时候,突然发现本应该是枚举内容的数据,导入了进了一个很大的不在枚举定义内的数字. 记得当时用的是 Enum.TryParse 方法对导入的文本进行校验的,于是调试了一下,发现果然是 ...

  9. iOS获取电量方法

    ios简单的方法: [UIDevice currentDevice].batteryMonitoringEnabled = YES; double deviceLevel = [UIDevice cu ...

随机推荐

  1. Java 中的接口有什么作用?好处?

    接口的作用就是把使用接口的人和实现接口的人分开,实现接口的人不必要关心谁去使用,而使用接口的人也不用关心谁实现的接口,由接口将他们联系在一起. 很多JAVA初级程序员对于接口存在的意义很疑惑.不知道接 ...

  2. Angular2.js——数据显示

    显示数据,即属性绑定机制把数据显示到用户界面上. 在Angular中最典型的数据显示方式,就是把HTML模板中的控件绑定到Angular组件的属性. 接下来介绍几种数据显示的语法和代码片段. 使用插值 ...

  3. 单Js 的重力游戏开发

    最近在用看cocos的时候萌生的想法,单纯js实现重力原理.然后就做了一个这样的小游戏.姑且命名为<超级玛丽>! 因为之前有人要我做超级玛丽.哈哈哈哈哈哈!这也算完成任务了吧. 先说一下原 ...

  4. 迁移 SQL Server 到 Azure SQL 实战

    最近有个维护的项目需要把 SQL Server 2012 的数据库迁移到 Azure SQL 上去.主要是因为租用的主机到期,而运营商停止了主机租赁业务,看来向云端的迁移是大势所趋啊!经过一番折腾最终 ...

  5. arcgis for javascript 之 clone()问题小计

    情景再现:      用户点击一个featurelayer的图斑,(属性信息从mysql中获取),同时高亮此地块,点击一下个地块时候,取消高亮.(请忽略跨域造成的图标错误,jetty试了好久不能跨域· ...

  6. MySQL 完整和增量备份与恢复

    MySQL 完全备份与恢复 1.数据备份的重要性 在企业中数据的价值至关重要,数据保障了企业的业务的运行,因此数据的安全性及可靠性是运维的重中之重,任何数据的丢失都有可能会对企业产生严重的后果.造成数 ...

  7. poj 1008

    #include<iostream>#include<string> using namespace std;string hname[19] = { "pop&qu ...

  8. HDU4704Sum 费马小定理+大数取模

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4704 题目大意: 看似复杂,其实就是求整数n的划分数,4=1+1+2和4=1+2+1是不同的.因而可 ...

  9. 使用Browserify来实现CommonJS的浏览器加载

    前面的话 Nodejs的模块是基于CommonJS规范实现的,可不可以应用在浏览器环境中呢? var math = require('math'); math.add(2, 3); 第二行math.a ...

  10. 密码学之DES/AES算法

    本文示例代码详见:https://github.com/52fhy/crypt-demo DES DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算 ...