开发了一个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. Unity UI 基础【译】

    https://unity3d.com/cn/learn/tutorials/topics/best-practices/fundamentals-unity-ui?playlist=30089 理解 ...

  2. OK 开始实践书上的项目一:即使标记

    OK 开始实践书上的项目一:及时标记 然而....又得往前面看啦! ----------------------我是分割线------------------------ 代码改变世界

  3. [ext4]08 磁盘布局 - CheckSums

    从2012年开始,Ext4和jbd2的元数据中都开始加入checksums.特性标识是metadata_csum.Checksum算法是在super_block中指定: struct ext4_sup ...

  4. register_sysctl_table实现内核数据交互

    作者:Younger Liu, 本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可. Sysctl是一种用户应用来设置和获得运行时内核的配置参数的一种有效方式,通 ...

  5. highcharts的多级下钻以及图形形态转换

    <script src="https://img.hcharts.cn/jquery/jquery-1.8.3.min.js"></script> < ...

  6. 完全背包hdu1114

    https://vjudge.net/contest/68966#problem/F 初始化就行了:dp[0]=0: 这题还要刚好装满背包,输出时进行判断 #include<map> #i ...

  7. HttpClient和 HtmlParser实现爬虫

    网络爬虫技术 1       什么叫网络爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不 ...

  8. 深入浅出新一代云网络——VPC中的那些功能与基于OpenStack Neutron的实现(一)

    VPC的概念与基于vxlan的overlay实现很早就有了,标题中的"新"只是一个和传统网络的相对概念.但从前年开始,不同于以往基础网络架构的新一代SDN网络才真正越来越多的走进国 ...

  9. JEESZ-Redis分布式缓存安装和使用

    独立缓存服务器: Linux CentOS Redis 版本: 3.0下面我们针对于Redis安装做下详细的记录:编译和安装所需的包:# yum install gcc tcl创建安装目录:# mkd ...

  10. UnicodeDecodeError: 'utf-8' codec can't decode byte 0xce in position 22: invalid continuation byte

    在使用python读取文本文件,一般会这样写: # -*- coding:utf-8 -*- f = open("train.txt", "r", encodi ...