我们在实际开发过程中,有时候需要判断一些实例的值是否为空和实例的类型是否正确,如果不正确,则是异常情况,要马上排除。需要及时的定位这种问题,可以用一个宏去实现值的空值和类型判断。在DEBUG模式下,如果为空值或者类型不正确就会Assert,在RELEASE模式下,只会简单的返回YES(YES代表实例的值或者类型不正确)
DEMO:
NSString *somethingNotImportant = nil;
if (CheckInvalidAndKindOfClass(somethingNotImportant, NSNumber)) {
//出错啦
return;
}
宏的实现
#ifndef FetchPropertyName
#define FetchPropertyName(VAL) (@""#VAL)
#endif
#ifndef FetchClass
#define FetchClass(VAL) ([VAL class])
#endif
#ifndef IsValid
#define IsValid(VAL) (VAL)
#endif
#ifndef IsKindOfClass
#define IsKindOfClass(VAL, CLASS) ([VAL isKindOfClass:[CLASS class]])
#endif
#ifndef CheckInvalidAndKindOfClass
#ifdef DEBUG
#define CheckInvalidAndKindOfClass(VAL, CLASS) \
( \
( \
!IsValid(VAL) ? \
^ BOOL { \
NSAssert(NO, @"NSAssert => %s Line %d\nInvalid value of \"%@\" ", __PRETTY_FUNCTION__, __LINE__, FetchPropertyName(VAL)); \
return YES; \
}() \
: \
NO \
) \
|| \
( \
!IsKindOfClass(VAL, CLASS) ? \
^ BOOL { \
NSAssert(NO, @"NSAssert => %s Line %d\nexpected class \"%@\" but class \"%@\" given ", __PRETTY_FUNCTION__, __LINE__, [CLASS class], FetchClass((VAL))); \
return YES; \
}() \
: \
NO \
) \
)
#else
#define CheckInvalidAndKindOfClass(VAL, CLASS) ((!IsValid(VAL)) || (!IsKindOfClass(VAL, CLASS)))
#endif
#endif