iOS enum C方法 DEBUG, RELEASE的隐藏的一个坑
开发了一个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的隐藏的一个坑的更多相关文章
- iOS关于沙盒文件拷贝manager.copyItem的一个坑
记录一下: 沙盒文件操作,当需要拷贝文件时,我们可以使用如下类似方式: // 文件拷贝 func copyFile(from:String,to:String)->Bool{ if !manag ...
- [iOS开发系列]根据Debug和Release状态的变化来屏蔽日志输出
今天在这里分享一个很实用的小技巧. 我们平时在开发应用的时候,经常会用到NSLog来调试我们的程序,而随着项目越来越大,这些用于调试的日志输出就会变得很难管理. 我们在发布正式版的时候一定要屏蔽掉所有 ...
- iOS调试程序的方法
IOS各种调试技巧豪华套餐 普通操作 如图3 基本的断点操作如下 图4 点击那个黑列列就创建了一个断点,再次点击就临时取消这个断点(但是不删除),长按那个断点拖出去就删除了(mac os的系统工程师就 ...
- iOS常用公共方法
iOS常用公共方法 字数2917 阅读3070 评论45 喜欢236 1. 获取磁盘总空间大小 //磁盘总空间 + (CGFloat)diskOfAllSizeMBytes{ CGFloat si ...
- Unity3D与iOS消息交互方法(1)--iOS接收Unity3D发出的消息
跨平台这种事情不管多NB, 总要有些与原生系统交互的方法, 比如 Unity3D与iOS消息交互方法. 一: 建立一个空的Unity工程. File --> New Project 二: 编 ...
- iOS 常用公共方法
iOS常用公共方法 1. 获取磁盘总空间大小 //磁盘总空间 + (CGFloat)diskOfAllSizeMBytes{ CGFloat size = 0.0; NSError *error; N ...
- 你遗忘的都在这里—iOS常用类型方法笔记
这些都是项目中常用但又常忘的方法,与大家分享一下. 一.NSString 创建字符串. NSString *astring = @"This is a String!"; 创建空 ...
- 关于 Enum.TryParse 方法的一个小坑…
今天在测试导入数据的时候,突然发现本应该是枚举内容的数据,导入了进了一个很大的不在枚举定义内的数字. 记得当时用的是 Enum.TryParse 方法对导入的文本进行校验的,于是调试了一下,发现果然是 ...
- iOS获取电量方法
ios简单的方法: [UIDevice currentDevice].batteryMonitoringEnabled = YES; double deviceLevel = [UIDevice cu ...
随机推荐
- DirectFB学习笔记二
本篇目的,画一个方框,在方框上画一串字符. 实现步骤:首先创建IDirectFB接口,通过它再创建要显示的表面surface,同时创建字体font,绘制字符必须要设置绘制的字体,否则绘制不成功.然后清 ...
- Linux 基础(2)
Linux 基础(二) 用户 组 及权限的相关操作 一.useradd命令选项:–u:指定用户的UID useradd –u 100 mu #指定mu的UID为100–g:指定用户所属的群组 user ...
- smarty的缓冲
首先在main文件夹里面建一个文件 huancun.php 然后在template文件夹里面建一个文件 huancun.html huancun.php中的内容为: require(" ...
- SQL检索记录
<<第一章检索记录>>:关于表使用SELECT语句和特殊字符"*": *:SELECT * from emp; 1:分别列出每一行:SELECT empno ...
- JS模式--装饰者模式(用AOP动态改变函数的参数)
Function.prototype.before = function (beforefn) { var _self = this; return function () { beforefn.ap ...
- 远程SSH连接服务与基本排错
为什么要远程连接Linux系统?? 在实际的工作场景中,虚拟机界面或物理服务器本地的窗口都是很少能够接触到的,因为服务器装完系统后,都要拉到IDC机房托管,如果是购买了云主机,更碰不到服务器本地显示器 ...
- (原创)看我用各种姿势在手机和PC查看到连接到的wifi密码
今天一个女神来我家做客,她问我WiFi密码,然而我却奇迹般的忘记了(特么的当时心里一万个草泥马踏过去),让我在她面前尴尬求子的,所以为了防止你们也出现这种情况,我特地把各种方法整理了一下,那么感兴趣的 ...
- 关于v-model、v-for、v-on的用法
展示Holle Vue window.onload = function(){ var box = new Vue({ el:'#div', ...
- 前端工作日常爬坑之——单页面微信开发Jssdk相关,以及jssdk图片直传自己服务器的实现。
日常爬坑 遇到的情况大致说明: 项目基于Vue2全家桶实现,vue-router控制前端路由,路由模式是History(主要是领导追求太高,觉得hash带#号太丑,然后遇到了小坑...),主要是服务于 ...
- 微信小程序,前端大梦想(五)
微信小程序之综合应用-访问网络加载数据 移动端访问网络加载数据时必不可少的功能,本章将接入豆瓣电影API,以列表的形式展现数据,支持下拉刷新及点击查看详情.重点包括: l 访问网络 l 跳转画面及传参 ...