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
用于检测视图是否在显示