我們在實際開發(fā)過程中豹储,有時候需要判斷一些實例的值是否為空和實例的類型是否正確汇竭,如果不正確祥山,則是異常情況圃验,要馬上排除。需要及時的定位這種問題缝呕,可以用一個宏去實現(xiàn)值的空值和類型判斷澳窑。在DEBUG模式下斧散,如果為空值或者類型不正確就會Assert,在RELEASE模式下摊聋,只會簡單的返回YES(YES代表實例的值或者類型不正確)
DEMO:
NSString *somethingNotImportant = nil;
if (CheckInvalidAndKindOfClass(somethingNotImportant, NSNumber)) {
//出錯啦
return;
}
宏的實現(xiàn)
#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