正在加载今日诗词....
2 min read

iOS 数值是否正常

iOS 开发过程中经常会与数值打交道, 尤其是一些绘图或者地图相关的应用, 所以对于数值异常的处理就要多加小心
iOS 数值是否正常

nan crash

nan 问题经常出现:
1.除以0
2.sizeWithFont的字符串为nil
3.数学函数不正确运算

fix : if (isnan(num)) return nil;

有时可以在除法的分母增加一个不为0的值做防错处理. 算是小技巧吧.

infinite crash

fix : if (isfinite(num)) return nil;

not correct rect

解决方案,添加防错判断

if (isnan(rect.x) || isnan(rect.y) || isinf(rect.x) || isinf(rect.y)) {
    // 错误处理
}

源码

  • number
#define isnormal(x)                                               \
    ( sizeof(x) == sizeof(float)  ? __isnormalf((float)(x))       \
    : sizeof(x) == sizeof(double) ? __isnormald((double)(x))      \
                                  : __isnormall((long double)(x)))
    
#define isfinite(x)                                               \
    ( sizeof(x) == sizeof(float)  ? __isfinitef((float)(x))       \
    : sizeof(x) == sizeof(double) ? __isfinited((double)(x))      \
                                  : __isfinitel((long double)(x)))
    
#define isinf(x)                                                  \
    ( sizeof(x) == sizeof(float)  ? __isinff((float)(x))          \
    : sizeof(x) == sizeof(double) ? __isinfd((double)(x))         \
                                  : __isinfl((long double)(x)))
    
#define isnan(x)                                                  \
    ( sizeof(x) == sizeof(float)  ? __isnanf((float)(x))          \
    : sizeof(x) == sizeof(double) ? __isnand((double)(x))         \
                                  : __isnanl((long double)(x)))
    
#define signbit(x)                                                \
    ( sizeof(x) == sizeof(float)  ? __signbitf((float)(x))        \
    : sizeof(x) == sizeof(double) ? __signbitd((double)(x))       \
                                  : __signbitl((long double)(x)))

isnormal()

作用:确定给定的浮点数 arg 是否为正规值,即不是零、非正规、无穷大或 NaN 。

isfinite()

作用:确定给定的浮点数 arg 是否拥有有限值,即它是正规、非正规或零,但不是无穷大或 NaN 。

isinf()

作用: 确定给定浮点数 arg 是否为正或负无穷大。

isnan

作用: 确定给定的浮点数 arg 是否为非数( NaN )值。

  • rect
CG_EXTERN bool CGRectIsEmpty(CGRect rect)
    CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);

/* Return true if `rect' is the null rectangle, false otherwise. */

CG_EXTERN bool CGRectIsNull(CGRect rect)
    CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);

/* Return true if `rect' is the infinite rectangle, false otherwise. */

CG_EXTERN bool CGRectIsInfinite(CGRect rect)
    CG_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_2_0);
  • CGRectIsNull 用于检测视图是否在显示

参考