首页 > 代码库 > iOS enum C方法 DEBUG, RELEASE的一个隐藏的一个坑
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 = 0, kE_BZ_TestType_One = 1, }; // 翻译函数定义 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 模式代码优化导致的结果
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Menlo; color: #ffffff; min-height: 15.0px } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Menlo; color: #ffffff } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Menlo; color: #08fa95 } span.s1 { } span.s2 { color: #00b1ff } span.s3 { color: #08fa95 } span.s4 { color: #de38a6 } span.s5 { color: #ffffff } span.s6 { color: #ff4647 } span.s7 { font: 13.0px "PingFang SC"; color: #ff4647 }</style>
iOS enum C方法 DEBUG, RELEASE的一个隐藏的一个坑
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。