iOS enum C方法 DEBUG, RELEASE的一个隐藏的一个坑

Posted 传说中的汽水枪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 模式代码优化导致的结果

 

以上是关于iOS enum C方法 DEBUG, RELEASE的一个隐藏的一个坑的主要内容,如果未能解决你的问题,请参考以下文章

C/C++ 中enum枚举量的介绍:介绍enum枚举量在C/C中的作用和使用方法

在 Python 中将字符串转换为枚举

../../build/debug/codegen/libCodeGen.a(llvm-codegen.cc.o ):( data.rel.ro_ZTIN4llvm18ValueMapCallback

不同 Debug 和 Release 框架的环境配置 - Xcode

为啥 Enum 的 HasFlag 方法需要装箱?

Enum使用name()还是toString()方法