• ios 网络请求后 Crash


    #import <Foundation/Foundation.h>
    
    @interface NSString (SHYUtil)
    
    /*!
     @method charValue
     @abstract 把字符串转为char类型
     @result 返回char
     */
    - (char)charValue;
    
    /*!
     @method unsignedCharValue
     @abstract 把字符串转为unsigned char类型
     @result 返回unsigned char
     */
    - (unsigned char)unsignedCharValue;
    
    /*!
     @method shortValue
     @abstract 把字符串转为short类型
     @result 返回short
     */
    - (short)shortValue;
    
    /*!
     @method unsignedShortValue
     @abstract 把字符串转为unsigned short类型
     @result 返回unsigned short
     */
    - (unsigned short)unsignedShortValue;
    
    /*!
     @method unsignedIntValue
     @abstract 把字符串转为unsigned int类型
     @result 返回unsigned int
     */
    - (unsigned int)unsignedIntValue;
    
    /*!
     @method longValue
     @abstract 把字符串转为long类型
     @result 返回long
     */
    - (long)longValue;
    
    /*!
     @method unsignedLongValue
     @abstract 把字符串转为unsigned long类型
     @result 返回unsigned long
     */
    - (unsigned long)unsignedLongValue;
    
    /*!
     @method longLongValue
     @abstract 把字符串转为long long int类型
     @result 返回long long int
     */
    - (long long int)longLongValue;
    
    /*!
     @method unsignedLongLongValue
     @abstract 把字符串转为unsigned long long类型
     @result 返回unsigned long long
     */
    - (unsigned long long)unsignedLongLongValue;
    
    /*!
     @method unsignedIntegerValue
     @abstract 把字符串转为NSUInteger类型
     @result 返回NSUInteger
     */
    - (NSUInteger)unsignedIntegerValue;
    
    /*!
     @method numberValue
     @abstract 把字符串转为NSNumber类型
     @result 返回NSNumber
     */
    - (NSNumber *)numberValue;
    
    /*!
     @method arrayValue
     @abstract 把字符串转为NSArray类型
     @result 返回NSArray
     */
    - (NSArray *)arrayValue;
    
    /*!
     @method dictionaryValue
     @abstract 把字符串转为NSDictionary类型
     @result 返回NSDictionary
     */
    - (NSDictionary *)dictionaryValue;
    
    /*!
     @method dataValue
     @abstract 把字符串转为NSData类型,只支持UTF-8有损转换;排UTF-8编码的请用 dataUsingEncoding: 方法转
     @result 返回NSData
     */
    - (NSData *)dataValue;
    
    /*!
     @method decimalValue
     @abstract 把字符串转为NSDecimal类型
     @result 返回NSDecimal
     */
    - (NSDecimal)decimalValue;
    
    /*!
     @method decimalNumberValue
     @abstract 把字符串转为NSDecimalNumber类型
     @result 返回NSDecimalNumber
     */
    - (NSDecimalNumber *)decimalNumberValue;
    
    
    @end
    
    
    
    #import "NSString+SHYUtil.h"
    #import <CommonCrypto/CommonDigest.h>
    
    #define SHY_CONVERT_USING(strtowhat) {
        char buf[24];
            if ([self getCString:buf maxLength:24 encoding:NSASCIIStringEncoding]) 
            return strtowhat(buf, NULL, 10);
        } 
        return strtowhat([self UTF8String], NULL, 10);
    
    @implementation NSString (SHYUtil)
    
    - (char)charValue
    {
        const char *str = [self UTF8String];
        return str[0];
    }
    
    - (unsigned char)unsignedCharValue
    {
        const char *str = [self UTF8String];
        return (unsigned char)str[0];
    }
    
    - (short)shortValue
    {
        int i = [self intValue];
        return (short)i;
    }
    
    - (unsigned short)unsignedShortValue
    {
        return (unsigned short)[self unsignedLongValue];
    }
    
    - (unsigned int)unsignedIntValue
    {
        return (unsigned int)[self unsignedLongValue];
    }
    
    - (long)longValue
    {
        SHY_CONVERT_USING(strtol);
    }
    
    - (unsigned long)unsignedLongValue
    {
        SHY_CONVERT_USING(strtoul);
    }
    
    - (long long int)longLongValue
    {
        SHY_CONVERT_USING(strtoll);
    }
    
    - (unsigned long long)unsignedLongLongValue
    {
        SHY_CONVERT_USING(strtoull);
    }
    
    - (NSUInteger)unsignedIntegerValue
    {
        return (NSUInteger)[self unsignedLongValue];
    }
    
    - (NSNumber *)numberValue
    {
        NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
        return [formatter numberFromString:self];
    }
    
    - (NSArray *)arrayValue
    {
        return [NSArray arrayWithObject:self];
    }
    
    - (NSDictionary *)dictionaryValue
    {
        return [self propertyList];
    }
    
    - (NSData *)dataValue
    {
        return [self dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
    }
    
    - (NSDecimal)decimalValue
    {
        return [[NSDecimalNumber decimalNumberWithString:self] decimalValue];
    }
    
    - (NSDecimalNumber *)decimalNumberValue
    {
        return [NSDecimalNumber decimalNumberWithString:self];
    }
    
    @end
    NSArray的扩展
    @interface NSArray (SHYUtil)
    
    /*!
     @method anyObject
     @abstract 获取数组里的一个对象,索引号小的优先返回
     @result 返回数组里的一个对象
     */
    - (id)anyObject;
    
    /*!
     @method isEmpty
     @abstract 是否没有对象,没有对象也是为YES;
     @result 返回BOOL
     */
    - (BOOL)isEmpty;
    
    /*!
     @method objectAtIndexCheck:
     @abstract 检查是否越界和NSNull如果是返回nil
     @result 返回对象
     */
    - (id)objectAtIndexCheck:(NSUInteger)index;
    
    /*!
     @method objectAtIndexCheck:class:defaultValue:
     @abstract 获取指定index的对象并检查是否越界和NSNull如果是返回nil
     @param index 索引号
     @param aClass 检查类型
     @result 返回对象
     */
    - (id)objectAtIndexCheck:(NSUInteger)index class:(__unsafe_unretained Class)aClass;
    
    /*!
     @method objectAtIndexCheck:class:defaultValue:
     @abstract 获取指定index的对象并检查是否越界和NSNull如果是返回nil,获取失败返回为指定的defaultValue
     @param index 索引号
     @param aClass 检查类型
     @param defaultValue 获取失败要返回的值
     @result 返回对象,获取失败为指定的defaultValue
     */
    - (id)objectAtIndexCheck:(NSUInteger)index class:(__unsafe_unretained Class)aClass defaultValue:(id)defaultValue;
    
    /*!
     @method arrayAtIndex:
     @abstract 获取指定index的NSArray类型值
     @param index 索引号
     @result 返回NSArray,获取失败为nil
     */
    - (NSArray *)arrayAtIndex:(NSUInteger)index;
    
    /*!
     @method arrayAtIndex:defaultValue:
     @abstract 获取指定index的NSArray类型值
     @param index 索引号
     @param defaultValue 获取失败要返回的值
     @result 返回NSArray,获取失败为指定的defaultValue
     */
    - (NSArray *)arrayAtIndex:(NSUInteger)index defaultValue:(NSArray *)defaultValue;
    
    /*!
     @method mutableArrayAtIndex:
     @abstract 获取指定index的NSMutableArray类型值
     @param index 索引号
     @result 返回NSMutableArray,获取失败为nil
     */
    - (NSMutableArray *)mutableArrayAtIndex:(NSUInteger)index;
    
    /*!
     @method mutableArrayAtIndex:defaultValue:
     @abstract 获取指定index的NSMutableArray类型值
     @param index 索引号
     @param defaultValue 获取失败要返回的值
     @result 返回NSMutableArray,获取失败为指定的defaultValue
     */
    - (NSMutableArray *)mutableArrayAtIndex:(NSUInteger)index defaultValue:(NSArray *)defaultValue;
    
    /*!
     @method dictionaryAtIndex:
     @abstract 获取指定index的NSDictionary类型值
     @param index 索引号
     @result 返回NSDictionary,获取失败为nil
     */
    - (NSDictionary *)dictionaryAtIndex:(NSUInteger)index;
    
    /*!
     @method dictionaryAtIndex:defaultValue:
     @abstract 获取指定index的NSDictionary类型值
     @param index 索引号
     @param defaultValue 获取失败要返回的值
     @result 返回NSDictionary,获取失败为指定的defaultValue
     */
    - (NSDictionary *)dictionaryAtIndex:(NSUInteger)index defaultValue:(NSDictionary *)defaultValue;
    
    /*!
     @method mutableDictionaryAtIndex:
     @abstract 获取指定index的NSMutableDictionary类型值
     @param index 索引号
     @result 返回NSMutableDictionary,获取失败为nil
     */
    - (NSMutableDictionary *)mutableDictionaryAtIndex:(NSUInteger)index;
    
    /*!
     @method mutableDictionaryAtIndex:defaultValue:
     @abstract 获取指定index的NSMutableDictionary类型值
     @param index 索引号
     @param defaultValue 获取失败要返回的值
     @result 返回NSMutableDictionary,获取失败为指定的defaultValue
     */
    - (NSMutableDictionary *)mutableDictionaryAtIndex:(NSUInteger)index defaultValue:(NSDictionary *)defaultValue;
    
    /*!
     @method dataAtIndex:
     @abstract 获取指定index的NSData类型值
     @param index 索引号
     @result 返回NSData,获取失败为nil
     */
    - (NSData *)dataAtIndex:(NSUInteger)index;
    
    /*!
     @method dataAtIndex:defaultValue:
     @abstract 获取指定index的NSData类型值
     @param index 索引号
     @param defaultValue 获取失败要返回的值
     @result 返回NSData,获取失败为指定的defaultValue
     */
    - (NSData *)dataAtIndex:(NSUInteger)index defaultValue:(NSData *)defaultValue;
    
    /*!
     @method stringAtIndex:
     @abstract 获取指定index的NSString类型值
     @param index 索引号
     @result 返回NSString,获取失败为nil
     */
    - (NSString *)stringAtIndex:(NSUInteger)index;
    
    /*!
     @method stringAtIndexToString:
     @abstract 获取指定index的NSString类型值
     @param index 索引号
     @result 返回字NSString,获取失败为@""
     */
    - (NSString *)stringAtIndexToString:(NSUInteger)index;
    
    /*!
     @method stringAtIndex:defaultValue:
     @abstract 获取指定index的NSString类型值,获取失败返回为指定的defaultValue
     @param index 索引号
     @param defaultValue 获取失败要返回的值
     @result 返回NSString,获取失败为指定的defaultValue
     */
    - (NSString *)stringAtIndex:(NSUInteger)index defaultValue:(NSString *)defaultValue;
    
    /*!
     @method numberAtIndex:
     @abstract 获取指定index的NSNumber类型值
     @param index 索引号
     @result 返回NSNumber,获取失败为nil
     */
    - (NSNumber *)numberAtIndex:(NSUInteger)index;
    
    /*!
     @method numberAtIndex:defaultValue:
     @abstract 获取指定index的NSNumber类型值
     @param index 索引号
     @param defaultValue 获取失败要返回的值
     @result 返回NSNumber,获取失败为指定的defaultValue
     */
    - (NSNumber *)numberAtIndex:(NSUInteger)index defaultValue:(NSNumber *)defaultValue;
    
    /*!
     @method charAtIndex:
     @abstract 获取指定index的NSNumber类型值
     @param index 索引号
     @result 返回char
     */
    - (char)charAtIndex:(NSUInteger)index;
    
    /*!
     @method unsignedCharAtIndex:
     @abstract 获取指定index的unsigned char类型值
     @param index 索引号
     @result 返回unsigned char
     */
    - (unsigned char)unsignedCharAtIndex:(NSUInteger)index;
    
    /*!
     @method shortAtIndex:
     @abstract 获取指定index的short类型值
     @param index 索引号
     @result 返回short,获取失败为0
     */
    - (short)shortAtIndex:(NSUInteger)index;
    
    /*!
     @method shortAtIndex:defaultValue:
     @abstract 获取指定index的short类型值
     @param index 索引号
     @param defaultValue 获取失败要返回的值
     @result 返回short,获取失败为指定的defaultValue
     */
    - (short)shortAtIndex:(NSUInteger)index defaultValue:(short)defaultValue;
    
    /*!
     @method unsignedShortAtIndex:
     @abstract 获取指定index的unsigned short类型值
     @param index 索引号
     @result 返回unsigned short,获取失败为0
     */
    - (unsigned short)unsignedShortAtIndex:(NSUInteger)index;
    
    /*!
     @method unsignedShortAtIndex:defaultValue:
     @abstract 获取指定index的unsigned short类型值
     @param index 索引号
     @param defaultValue 获取失败要返回的值
     @result 返回unsigned short,获取失败为指定的defaultValue
     */
    - (unsigned short)unsignedShortAtIndex:(NSUInteger)index defaultValue:(unsigned short)defaultValue;
    
    /*!
     @method intAtIndex:
     @abstract 获取指定index的int类型值
     @param index 索引号
     @result 返回int,获取失败为0
     */
    - (int)intAtIndex:(NSUInteger)index;
    
    /*!
     @method intAtIndex:defaultValue:
     @abstract 获取指定index的int类型值
     @param index 索引号
     @param defaultValue 获取失败要返回的值
     @result 返回int,获取失败为指定的defaultValue
     */
    - (int)intAtIndex:(NSUInteger)index defaultValue:(int)defaultValue;
    
    /*!
     @method unsignedIntAtIndex:
     @abstract 获取指定index的unsigned int类型值
     @param index 索引号
     @result 返回unsigned int,获取失败为0
     */
    - (unsigned int)unsignedIntAtIndex:(NSUInteger)index;
    
    /*!
     @method unsignedIntAtIndex:defaultValue:
     @abstract 获取指定index的unsigned int类型值
     @param index 索引号
     @param defaultValue 获取失败要返回的值
     @result 返回unsigned int,获取失败为指定的defaultValue
     */
    - (unsigned int)unsignedIntAtIndex:(NSUInteger)index defaultValue:(unsigned int)defaultValue;
    
    /*!
     @method longAtIndex:
     @abstract 获取指定index的long类型值
     @param index 索引号
     @result 返回long,获取失败为0
     */
    - (long)longAtIndex:(NSUInteger)index;
    
    /*!
     @method longAtIndex:defaultValue:
     @abstract 获取指定index的long类型值
     @param defaultValue 获取失败要返回的值
     @result 返回long,获取失败为指定的defaultValue
     */
    - (long)longAtIndex:(NSUInteger)index defaultValue:(long)defaultValue;
    
    /*!
     @method unsignedLongAtIndex:
     @abstract 获取指定index的unsigned long类型值
     @param index 索引号
     @result 返回unsigned long,获取失败为0
     */
    - (unsigned long)unsignedLongAtIndex:(NSUInteger)index;
    
    /*!
     @method unsignedLongAtIndex:defaultValue:
     @abstract 获取指定index的unsigned long类型值
     @param index 索引号
     @param defaultValue 获取失败要返回的值
     @result 返回unsigned long,获取失败为指定的defaultValue
     */
    - (unsigned long)unsignedLongAtIndex:(NSUInteger)index defaultValue:(unsigned long)defaultValue;
    
    /*!
     @method longLongAtIndex:
     @abstract 获取指定index的long long类型值
     @param index 索引号
     @result 返回long long,获取失败为0
     */
    - (long long)longLongAtIndex:(NSUInteger)index;
    
    /*!
     @method longLongAtIndex:defaultValue:
     @abstract 获取指定index的long long类型值
     @param index 索引号
     @param defaultValue 获取失败要返回的值
     @result 返回long long,获取失败为指定的defaultValue
     */
    - (long long)longLongAtIndex:(NSUInteger)index defaultValue:(long long)defaultValue;
    
    /*!
     @method unsignedLongLongAtIndex:
     @abstract 获取指定index的unsigned long long类型值
     @param index 索引号
     @result 返回unsigned long long,获取失败为0
     */
    - (unsigned long long)unsignedLongLongAtIndex:(NSUInteger)index;
    
    /*!
     @method unsignedLongLongAtIndex:defaultValue:
     @abstract 获取指定index的unsigned long long类型值
     @param index 索引号
     @param defaultValue 获取失败要返回的值
     @result 返回unsigned long long,获取失败为指定的defaultValue
     */
    - (unsigned long long)unsignedLongLongAtIndex:(NSUInteger)index defaultValue:(unsigned long long)defaultValue;
    
    /*!
     @method floatAtIndex:
     @abstract 获取指定index的float类型值
     @param index 索引号
     @result 返回float,获取失败为0.0
     */
    - (float)floatAtIndex:(NSUInteger)index;
    
    /*!
     @method floatAtIndex:defaultValue:
     @abstract 获取指定index的float类型值
     @param index 索引号
     @param defaultValue 获取失败要返回的值
     @result 返回float,获取失败为指定的defaultValue
     */
    - (float)floatAtIndex:(NSUInteger)index defaultValue:(float)defaultValue;
    
    /*!
     @method doubleAtIndex:
     @abstract 获取指定index的double类型值
     @param index 索引号
     @result 返回double,获取失败为0.0
     */
    - (double)doubleAtIndex:(NSUInteger)index;
    
    /*!
     @method doubleAtIndex:defaultValue:
     @abstract 获取指定index的double类型值
     @param index 索引号
     @param defaultValue 获取失败要返回的值
     @result 返回double,获取失败为指定的defaultValue
     */
    - (double)doubleAtIndex:(NSUInteger)index defaultValue:(double)defaultValue;
    
    /*!
     @method boolAtIndex:
     @abstract 获取指定index的BOOL类型值
     @param index 索引号
     @result 返回BOOL,获取失败为NO
     */
    - (BOOL)boolAtIndex:(NSUInteger)index;
    
    /*!
     @method boolAtIndex:
     @abstract 获取指定index的BOOL类型值
     @param index 索引号
     @param defaultValue 获取失败要返回的值
     @result 返回BOOL,获取失败为指定的defaultValue
     */
    - (BOOL)boolAtIndex:(NSUInteger)index defaultValue:(BOOL)defaultValue;
    
    /*!
     @method integerAtIndex:
     @abstract 获取指定index的NSInteger类型值
     @param index 索引号
     @result 返回NSInteger,获取失败为0
     */
    - (NSInteger)integerAtIndex:(NSUInteger)index;
    
    /*!
     @method integerAtIndex:defaultValue:
     @abstract 获取指定index的NSInteger类型值
     @param index 索引号
     @param defaultValue 获取失败要返回的值
     @result 返回NSInteger,获取失败为指定的defaultValue
     */
    - (NSInteger)integerAtIndex:(NSUInteger)index defaultValue:(NSInteger)defaultValue;
    
    /*!
     @method unsignedIntegerAtIndex:
     @abstract 获取指定index的NSUInteger类型值
     @param index 索引号
     @result 返回NSUInteger,获取失败为0
     */
    - (NSUInteger)unsignedIntegerAtIndex:(NSUInteger)index;
    
    /*!
     @method unsignedIntegerAtIndex:defaultValue:
     @abstract 获取指定index的NSUInteger类型值
     @param index 索引号
     @param defaultValue 获取失败要返回的值
     @result 返回NSUInteger,获取失败为指定的defaultValue
     */
    - (NSUInteger)unsignedIntegerAtIndex:(NSUInteger)index defaultValue:(NSUInteger)defaultValue;
    
    /*!
     @method pointAtIndex:
     @abstract 获取指定index的CGPoint类型值
     @param index 索引号
     @result 返回CGPoint,获取失败为CGPointZero
     */
    - (CGPoint)pointAtIndex:(NSUInteger)index;
    
    /*!
     @method pointAtIndex:defaultValue:
     @abstract 获取指定index的CGPoint类型值
     @param index 索引号
     @param defaultValue 获取失败要返回的值
     @result 返回CGPoint,获取失败为指定的defaultValue
     */
    - (CGPoint)pointAtIndex:(NSUInteger)index defaultValue:(CGPoint)defaultValue;
    
    /*!
     @method sizeAtIndex:
     @abstract 获取指定index的CGSize类型值
     @param index 索引号
     @result 返回CGPoint,获取失败为CGSizeZero
     */
    - (CGSize)sizeAtIndex:(NSUInteger)index;
    
    /*!
     @method sizeAtIndex:defaultValue:
     @abstract 获取指定index的CGSize类型值
     @param index 索引号
     @param defaultValue 获取失败要返回的值
     @result 返回CGSize,获取失败为指定的defaultValue
     */
    - (CGSize)sizeAtIndex:(NSUInteger)index defaultValue:(CGSize)defaultValue;
    
    /*!
     @method rectAtIndex:
     @abstract 获取指定index的CGRect类型值
     @param index 索引号
     @result 返回CGPoint,获取失败为CGRectZero
     */
    - (CGRect)rectAtIndex:(NSUInteger)index;
    
    /*!
     @method rectAtIndex:
     @abstract 获取指定index的CGRect类型值
     @param index 索引号
     @param defaultValue 获取失败要返回的值
     @result 返回CGRect,获取失败为指定的defaultValue
     */
    - (CGRect)rectAtIndex:(NSUInteger)index defaultValue:(CGRect)defaultValue;
    
    @end
    
    
    @implementation NSArray (SHYUtil)
    
    - (id)anyObject
    {
        return [self count] > 0 ? [self objectAtIndexCheck:0] : nil;
    }
    
    - (BOOL)isEmpty
    {
        return ([self count] == 0);
    }
    
    - (id)objectAtIndexCheck:(NSUInteger)index
    {
        if (index >= [self count]) {
            return nil;
        }
        
        id value = [self objectAtIndex:index];
        if (value == [NSNull null]) {
            return nil;
        }
        return value;
    }
    
    - (id)objectAtIndexCheck:(NSUInteger)index class:(__unsafe_unretained Class)aClass
    {
        return [self objectAtIndexCheck:index class:aClass defaultValue:nil];
    }
    
    - (id)objectAtIndexCheck:(NSUInteger)index class:(__unsafe_unretained Class)aClass defaultValue:(id)defaultValue
    {
        id value = [self objectAtIndexCheck:index];
        if (![value isKindOfClass:aClass]) {
            return defaultValue;
        }
        return value;
    }
    
    - (NSArray *)arrayAtIndex:(NSUInteger)index
    {
        return [self arrayAtIndex:index defaultValue:nil];
    }
    
    - (NSArray *)arrayAtIndex:(NSUInteger)index defaultValue:(NSArray *)defaultValue
    {
        return [self objectAtIndexCheck:index class:[NSArray class] defaultValue:defaultValue];
    }
    
    - (NSMutableArray *)mutableArrayAtIndex:(NSUInteger)index
    {
        return [self mutableArrayAtIndex:index defaultValue:nil];
    }
    
    - (NSMutableArray *)mutableArrayAtIndex:(NSUInteger)index defaultValue:(NSArray *)defaultValue
    {
        return [self objectAtIndexCheck:index class:[NSMutableArray class] defaultValue:defaultValue];
    }
    
    - (NSDictionary *)dictionaryAtIndex:(NSUInteger)index
    {
        return [self dictionaryAtIndex:index defaultValue:nil];
    }
    
    - (NSDictionary *)dictionaryAtIndex:(NSUInteger)index defaultValue:(NSDictionary *)defaultValue
    {
        return [self objectAtIndexCheck:index class:[NSDictionary class] defaultValue:defaultValue];
    }
    
    - (NSMutableDictionary *)mutableDictionaryAtIndex:(NSUInteger)index
    {
        return [self mutableDictionaryAtIndex:index defaultValue:nil];
    }
    
    - (NSMutableDictionary *)mutableDictionaryAtIndex:(NSUInteger)index defaultValue:(NSDictionary *)defaultValue
    {
        return [self objectAtIndexCheck:index class:[NSMutableDictionary class] defaultValue:defaultValue];
    }
    
    - (NSData *)dataAtIndex:(NSUInteger)index
    {
        return [self dataAtIndex:index defaultValue:nil];
    }
    
    - (NSData *)dataAtIndex:(NSUInteger)index defaultValue:(NSData *)defaultValue
    {
        return [self objectAtIndexCheck:index class:[NSData class] defaultValue:defaultValue];
    }
    
    - (NSString *)stringAtIndex:(NSUInteger)index
    {
        return [self stringAtIndex:index defaultValue:nil];
    }
    
    - (NSString *)stringAtIndexToString:(NSUInteger)index
    {
        return [self stringAtIndex:index defaultValue:@""];
    }
    
    - (NSString *)stringAtIndex:(NSUInteger)index defaultValue:(NSString *)defaultValue
    {
        id value = [self objectAtIndexCheck:index];
        
        if ([value isKindOfClass:[NSNumber class]]) {
            return [value stringValue];
        }
        
        if (![value isKindOfClass:[NSString class]]) {
            return defaultValue;
        }
        return value;
    }
    
    - (NSNumber *)numberAtIndex:(NSUInteger)index
    {
        return [self numberAtIndex:index defaultValue:nil];
    }
    
    - (NSNumber *)numberAtIndex:(NSUInteger)index defaultValue:(NSNumber *)defaultValue
    {
        id value = [self objectAtIndexCheck:index];
        if ([value isKindOfClass:[NSString class]]) {
            return [value numberValue];
        }
        
        if (![value isKindOfClass:[NSNumber class]]) {
            return defaultValue;
        }
        
        return value;
    }
    
    - (char)charAtIndex:(NSUInteger)index
    {
        id value = [self objectAtIndexCheck:index];
        if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) {
            return [value charValue];
        }
        else {
            return 0x0;
        }
    }
    
    - (unsigned char)unsignedCharAtIndex:(NSUInteger)index
    {
        id value = [self objectAtIndexCheck:index];
        if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) {
            return [value unsignedCharValue];
        }
        else {
            return 0x0;
        }
    }
    
    - (short)shortAtIndex:(NSUInteger)index
    {
        return [self shortAtIndex:index defaultValue:0];
    }
    
    - (short)shortAtIndex:(NSUInteger)index defaultValue:(short)defaultValue
    {
        id value = [self objectAtIndexCheck:index];
        if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) {
            return [value shortValue];
        }
        else {
            return defaultValue;
        }
    }
    
    - (unsigned short)unsignedShortAtIndex:(NSUInteger)index
    {
        return [self unsignedShortAtIndex:index defaultValue:0];
    }
    
    - (unsigned short)unsignedShortAtIndex:(NSUInteger)index defaultValue:(unsigned short)defaultValue
    {
        id value = [self objectAtIndexCheck:index];
        if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) {
            return [value unsignedShortValue];
        }
        else {
            return defaultValue;
        }
    }
    
    - (int)intAtIndex:(NSUInteger)index
    {
        return [self intAtIndex:index defaultValue:0];
    }
    
    - (int)intAtIndex:(NSUInteger)index defaultValue:(int)defaultValue
    {
        id value = [self objectAtIndexCheck:index];
        if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) {
            return [value intValue];
        }
        else {
            return defaultValue;
        }
    }
    
    - (unsigned int)unsignedIntAtIndex:(NSUInteger)index
    {
        return [self unsignedIntAtIndex:index defaultValue:0];
    }
    
    - (unsigned int)unsignedIntAtIndex:(NSUInteger)index defaultValue:(unsigned int)defaultValue
    {
        id value = [self objectAtIndexCheck:index];
        if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) {
            return [value unsignedIntValue];
        }
        else {
            return defaultValue;
        }
    }
    
    - (long)longAtIndex:(NSUInteger)index
    {
        return [self longAtIndex:index defaultValue:0];
    }
    
    - (long)longAtIndex:(NSUInteger)index defaultValue:(long)defaultValue
    {
        id value = [self objectAtIndexCheck:index];
        if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) {
            return [value longValue];
        }
        else {
            return defaultValue;
        }
    }
    
    - (unsigned long)unsignedLongAtIndex:(NSUInteger)index
    {
        return [self unsignedLongAtIndex:index defaultValue:0];
    }
    
    - (unsigned long)unsignedLongAtIndex:(NSUInteger)index defaultValue:(unsigned long)defaultValue
    {
        id value = [self objectAtIndexCheck:index];
        if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) {
            return [value unsignedLongValue];
        }
        else {
            return defaultValue;
        }
    }
    
    - (long long)longLongAtIndex:(NSUInteger)index
    {
        return [self longLongAtIndex:index defaultValue:0];
    }
    
    - (long long)longLongAtIndex:(NSUInteger)index defaultValue:(long long)defaultValue
    {
        id value = [self objectAtIndexCheck:index];
        if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) {
            return [value longLongValue];
        }
        else {
            return defaultValue;
        }
    }
    
    - (unsigned long long)unsignedLongLongAtIndex:(NSUInteger)index
    {
        return [self unsignedLongLongAtIndex:index defaultValue:0];
    }
    
    - (unsigned long long)unsignedLongLongAtIndex:(NSUInteger)index defaultValue:(unsigned long long)defaultValue
    {
        id value = [self objectAtIndexCheck:index];
        if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) {
            return [value unsignedLongLongValue];
        }
        else {
            return defaultValue;
        }
    }
    
    - (float)floatAtIndex:(NSUInteger)index
    {
        return [self floatAtIndex:index defaultValue:0.0];
    }
    
    - (float)floatAtIndex:(NSUInteger)index defaultValue:(float)defaultValue
    {
        id value = [self objectAtIndexCheck:index];
        if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) {
            float result = [value floatValue];
            return isnan(result) ? defaultValue : result;
        }
        else {
            return defaultValue;
        }
    }
    
    - (double)doubleAtIndex:(NSUInteger)index
    {
        return [self doubleAtIndex:index defaultValue:0.0];
    }
    
    - (double)doubleAtIndex:(NSUInteger)index defaultValue:(double)defaultValue
    {
        id value = [self objectAtIndexCheck:index];
        if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) {
            double result = [value doubleValue];
            return isnan(result) ? defaultValue : result;
        }
        else {
            return defaultValue;
        }
    }
    
    - (BOOL)boolAtIndex:(NSUInteger)index
    {
        return [self boolAtIndex:index defaultValue:NO];
    }
    
    - (BOOL)boolAtIndex:(NSUInteger)index defaultValue:(BOOL)defaultValue
    {
        id value = [self objectAtIndexCheck:index];
        if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) {
            return [value boolValue];
        }
        else {
            return defaultValue;
        }
    }
    
    - (NSInteger)integerAtIndex:(NSUInteger)index
    {
        return [self integerAtIndex:index defaultValue:0];
    }
    
    - (NSInteger)integerAtIndex:(NSUInteger)index defaultValue:(NSInteger)defaultValue
    {
        id value = [self objectAtIndexCheck:index];
        if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) {
            return [value integerValue];
        }
        else {
            return defaultValue;
        }
    }
    
    - (NSUInteger)unsignedIntegerAtIndex:(NSUInteger)index
    {
        return [self unsignedIntegerAtIndex:index defaultValue:0];
    }
    
    - (NSUInteger)unsignedIntegerAtIndex:(NSUInteger)index defaultValue:(NSUInteger)defaultValue
    {
        id value = [self objectAtIndexCheck:index];
        if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) {
            return [value unsignedIntegerValue];
        }
        else {
            return defaultValue;
        }
    }
    
    - (CGPoint)pointAtIndex:(NSUInteger)index
    {
        return [self pointAtIndex:index defaultValue:CGPointZero];
    }
    
    - (CGPoint)pointAtIndex:(NSUInteger)index defaultValue:(CGPoint)defaultValue
    {
        id value = [self objectAtIndexCheck:index];
        if ([value isKindOfClass:[NSString class]] && ![value isEmpty])
            return CGPointFromString(value);
        else if ([value isKindOfClass:[NSValue class]])
            return [value CGPointValue];
        else
            return defaultValue;
    }
    
    - (CGSize)sizeAtIndex:(NSUInteger)index
    {
        return [self sizeAtIndex:index defaultValue:CGSizeZero];
    }
    
    - (CGSize)sizeAtIndex:(NSUInteger)index defaultValue:(CGSize)defaultValue
    {
        id value = [self objectAtIndexCheck:index];
        if ([value isKindOfClass:[NSString class]] && ![value isEmpty])
            return CGSizeFromString(value);
        else if ([value isKindOfClass:[NSValue class]])
            return [value CGSizeValue];
        else
            return defaultValue;
    }
    
    - (CGRect)rectAtIndex:(NSUInteger)index
    {
        return [self rectAtIndex:index defaultValue:CGRectZero];
    }
    
    - (CGRect)rectAtIndex:(NSUInteger)index defaultValue:(CGRect)defaultValue
    {
        id value = [self objectAtIndexCheck:index];
        if ([value isKindOfClass:[NSString class]] && ![value isEmpty])
            return CGRectFromString(value);
        else if ([value isKindOfClass:[NSValue class]])
            return [value CGRectValue];
        else
            return defaultValue;
    }
    
    @end
    
    NSDictionary的扩展
    @interface NSDictionary (SHYUtil)
    
    /*!
     @method dictionaryWithContentsOfData:
     @abstract 把NSData数据转成NSDictionary
     @result 返回NSDictionary
     */
    + (NSDictionary *)dictionaryWithContentsOfData:(NSData *)data;
    
    /*!
     @method isEmpty
     @abstract 是否空,字典里没有对象也是为YES;
     @result 返回bool
     */
    - (BOOL)isEmpty;
    
    /*!
     @method objectForKeyCheck
     @abstract 检查是否aKey为nil 和 NSNull null如果是返回nil
     @result 返回对象
     */
    - (id)objectForKeyCheck:(id)aKey;
    
    /*!
     @method objectForKeyCheck:class:
     @abstract 获取指定key的对象
     @param key 键
     @param aClass 检查类型
     @result 返回对象
     */
    - (id)objectForKeyCheck:(id)key class:(__unsafe_unretained Class)aClass;
    
    /*!
     @method objectForKeyCheck:class:defaultValue:
     @abstract 获取指定key的对象
     @param key 键
     @param aClass 检查类型
     @param defaultValue 获取失败要返回的值
     @result 返回对象,获取失败为指定的defaultValue
     */
    - (id)objectForKeyCheck:(id)key class:(__unsafe_unretained Class)aClass defaultValue:(id)defaultValue;
    
    /*!
     @method arrayForKey:
     @abstract 获取指定key的NSArray类型值
     @param key 键
     @result 返回NSArray,获取失败为nil
     */
    - (NSArray *)arrayForKey:(id)key;
    
    /*!
     @method arrayForKey:defaultValue:
     @abstract 获取指定key的NSArray类型值
     @param key 键
     @param defaultValue 获取失败要返回的值
     @result 返回NSArray,获取失败为指定的defaultValue
     */
    - (NSArray *)arrayForKey:(id)key defaultValue:(NSArray *)defaultValue;
    
    /*!
     @method mutableArrayForKey:
     @abstract 获取指定key的NSMutableArray类型值
     @param key 键
     @result 返回NSMutableArray,获取失败为nil
     */
    - (NSMutableArray *)mutableArrayForKey:(id)key;
    
    /*!
     @method mutableArrayForKey:defaultValue:
     @abstract 获取指定key的NSMutableArray类型值
     @param key 键
     @param defaultValue 获取失败要返回的值
     @result 返回NSMutableArray,获取失败为指定的defaultValue
     */
    - (NSMutableArray *)mutableArrayForKey:(id)key defaultValue:(NSArray *)defaultValue;
    
    /*!
     @method dictionaryForKey:
     @abstract 获取指定key的NSDictionary类型值
     @param key 键
     @result 返回NSDictionary,获取失败为nil
     */
    - (NSDictionary *)dictionaryForKey:(id)key;
    
    /*!
     @method dictionaryForKey:defaultValue:
     @abstract 获取指定key的NSDictionary类型值
     @param key 键
     @param defaultValue 获取失败要返回的值
     @result 返回NSDictionary,获取失败为指定的defaultValue
     */
    - (NSDictionary *)dictionaryForKey:(id)key defaultValue:(NSDictionary *)defaultValue;
    
    /*!
     @method mutableDictionaryForKey:
     @abstract 获取指定key的NSMutableDictionary类型值
     @param key 键
     @result 返回NSMutableDictionary,获取失败为nil
     */
    - (NSMutableDictionary *)mutableDictionaryForKey:(id)key;
    
    /*!
     @method mutableDictionaryForKey:defaultValue:
     @abstract 获取指定key的NSMutableDictionary类型值
     @param key 键
     @param defaultValue 获取失败要返回的值
     @result 返回NSMutableDictionary,获取失败为指定的defaultValue
     */
    - (NSMutableDictionary *)mutableDictionaryForKey:(id)key defaultValue:(NSDictionary *)defaultValue;
    
    /*!
     @method dataForKey:
     @abstract 获取指定key的NSData类型值
     @param key 键
     @result 返回NSData,获取失败为nil
     */
    - (NSData *)dataForKey:(id)key;
    
    /*!
     @method dataForKey:defaultValue:
     @abstract 获取指定key的NSData类型值
     @param key 键
     @param defaultValue 获取失败要返回的值
     @result 返回NSData,获取失败为指定的defaultValue
     */
    - (NSData *)dataForKey:(id)key defaultValue:(NSData *)defaultValue;
    
    /*!
     @method stringForKey:
     @abstract 获取指定key的NSString类型值
     @param key 键
     @result 返回NSString,获取失败为nil
     */
    - (NSString *)stringForKey:(id)key;
    
    /*!
     @method stringForKeyToString:
     @abstract 获取指定key的NSString类型值
     @param key 键
     @result 返回字NSString,获取失败为@""
     */
    - (NSString *)stringForKeyToString:(id)key;
    
    /*!
     @method stringForKey:defaultValue:
     @abstract 获取指定key的NSString类型值,获取失败返回为指定的defaultValue
     @param key 键
     @param defaultValue 获取失败要返回的值
     @result 返回NSString,获取失败为指定的defaultValue
     */
    - (NSString *)stringForKey:(id)key defaultValue:(NSString *)defaultValue;
    
    /*!
     @method numberForKey:
     @abstract 获取指定key的NSNumber类型值
     @param key 键
     @result 返回NSNumber,获取失败为nil
     */
    - (NSNumber *)numberForKey:(id)key;
    
    /*!
     @method numberForKey:defaultValue:
     @abstract 获取指定key的NSNumber类型值
     @param key 键
     @param defaultValue 获取失败要返回的值
     @result 返回NSNumber,获取失败为指定的defaultValue
     */
    - (NSNumber *)numberForKey:(id)key defaultValue:(NSNumber *)defaultValue;
    
    /*!
     @method charForKey:
     @abstract 获取指定key的NSNumber类型值
     @param key 键
     @result 返回char
     */
    - (char)charForKey:(id)key;
    
    /*!
     @method unsignedCharForKey:
     @abstract 获取指定key的unsigned char类型值
     @param key 键
     @result 返回unsigned char
     */
    - (unsigned char)unsignedCharForKey:(id)key;
    
    /*!
     @method shortForKey:
     @abstract 获取指定key的short类型值
     @param key 键
     @result 返回short,获取失败为0
     */
    - (short)shortForKey:(id)key;
    
    /*!
     @method shortForKey:defaultValue:
     @abstract 获取指定key的short类型值
     @param key 键
     @param defaultValue 获取失败要返回的值
     @result 返回short,获取失败为指定的defaultValue
     */
    - (short)shortForKey:(id)key defaultValue:(short)defaultValue;
    
    /*!
     @method unsignedShortForKey:
     @abstract 获取指定key的unsigned short类型值
     @param key 键
     @result 返回unsigned short,获取失败为0
     */
    - (unsigned short)unsignedShortForKey:(id)key;
    
    /*!
     @method unsignedShortForKey:defaultValue:
     @abstract 获取指定key的unsigned short类型值
     @param key 键
     @param defaultValue 获取失败要返回的值
     @result 返回unsigned short,获取失败为指定的defaultValue
     */
    - (unsigned short)unsignedShortForKey:(id)key defaultValue:(unsigned short)defaultValue;
    
    /*!
     @method intForKey:
     @abstract 获取指定key的int类型值
     @param key 键
     @result 返回int,获取失败为0
     */
    - (int)intForKey:(id)key;
    
    /*!
     @method intForKey:defaultValue:
     @abstract 获取指定key的int类型值
     @param key 键
     @param defaultValue 获取失败要返回的值
     @result 返回int,获取失败为指定的defaultValue
     */
    - (int)intForKey:(id)key defaultValue:(int)defaultValue;
    
    /*!
     @method unsignedIntForKey:
     @abstract 获取指定key的unsigned int类型值
     @param key 键
     @result 返回unsigned int,获取失败为0
     */
    - (unsigned int)unsignedIntForKey:(id)key;
    
    /*!
     @method unsignedIntForKey:defaultValue:
     @abstract 获取指定key的unsigned int类型值
     @param key 键
     @param defaultValue 获取失败要返回的值
     @result 返回unsigned int,获取失败为指定的defaultValue
     */
    - (unsigned int)unsignedIntForKey:(id)key defaultValue:(unsigned int)defaultValue;
    
    /*!
     @method longForKey:
     @abstract 获取指定key的long类型值
     @param key 键
     @result 返回long,获取失败为0
     */
    - (long)longForKey:(id)key;
    
    /*!
     @method longForKey:defaultValue:
     @abstract 获取指定key的long类型值
     @param defaultValue 获取失败要返回的值
     @result 返回long,获取失败为指定的defaultValue
     */
    - (long)longForKey:(id)key defaultValue:(long)defaultValue;
    
    /*!
     @method unsignedLongForKey:
     @abstract 获取指定key的unsigned long类型值
     @param key 键
     @result 返回unsigned long,获取失败为0
     */
    - (unsigned long)unsignedLongForKey:(id)key;
    
    /*!
     @method unsignedLongForKey:defaultValue:
     @abstract 获取指定key的unsigned long类型值
     @param key 键
     @param defaultValue 获取失败要返回的值
     @result 返回unsigned long,获取失败为指定的defaultValue
     */
    - (unsigned long)unsignedLongForKey:(id)key defaultValue:(unsigned long)defaultValue;
    
    /*!
     @method longLongForKey:
     @abstract 获取指定key的long long类型值
     @param key 键
     @result 返回long long,获取失败为0
     */
    - (long long)longLongForKey:(id)key;
    
    /*!
     @method longLongForKey:defaultValue:
     @abstract 获取指定key的long long类型值
     @param key 键
     @param defaultValue 获取失败要返回的值
     @result 返回long long,获取失败为指定的defaultValue
     */
    - (long long)longLongForKey:(id)key defaultValue:(long long)defaultValue;
    
    /*!
     @method unsignedLongLongForKey:
     @abstract 获取指定key的unsigned long long类型值
     @param key 键
     @result 返回unsigned long long,获取失败为0
     */
    - (unsigned long long)unsignedLongLongForKey:(id)key;
    
    /*!
     @method unsignedLongLongForKey:defaultValue:
     @abstract 获取指定key的unsigned long long类型值
     @param key 键
     @param defaultValue 获取失败要返回的值
     @result 返回unsigned long long,获取失败为指定的defaultValue
     */
    - (unsigned long long)unsignedLongLongForKey:(id)key defaultValue:(unsigned long long)defaultValue;
    
    /*!
     @method floatForKey:
     @abstract 获取指定key的float类型值
     @param key 键
     @result 返回float,获取失败为0.0
     */
    - (float)floatForKey:(id)key;
    
    /*!
     @method floatForKey:defaultValue:
     @abstract 获取指定key的float类型值
     @param key 键
     @param defaultValue 获取失败要返回的值
     @result 返回float,获取失败为指定的defaultValue
     */
    - (float)floatForKey:(id)key defaultValue:(float)defaultValue;
    
    /*!
     @method doubleForKey:
     @abstract 获取指定key的double类型值
     @param key 键
     @result 返回double,获取失败为0.0
     */
    - (double)doubleForKey:(id)key;
    
    /*!
     @method doubleForKey:defaultValue:
     @abstract 获取指定key的double类型值
     @param key 键
     @param defaultValue 获取失败要返回的值
     @result 返回double,获取失败为指定的defaultValue
     */
    - (double)doubleForKey:(id)key defaultValue:(double)defaultValue;
    
    /*!
     @method boolForKey:
     @abstract 获取指定key的BOOL类型值
     @param key 键
     @result 返回BOOL,获取失败为NO
     */
    - (BOOL)boolForKey:(id)key;
    
    /*!
     @method boolForKey:
     @abstract 获取指定key的BOOL类型值
     @param key 键
     @param defaultValue 获取失败要返回的值
     @result 返回BOOL,获取失败为指定的defaultValue
     */
    - (BOOL)boolForKey:(id)key defaultValue:(BOOL)defaultValue;
    
    /*!
     @method integerForKey:
     @abstract 获取指定key的NSInteger类型值
     @param key 键
     @result 返回NSInteger,获取失败为0
     */
    - (NSInteger)integerForKey:(id)key;
    
    /*!
     @method integerForKey:defaultValue:
     @abstract 获取指定key的NSInteger类型值
     @param key 键
     @param defaultValue 获取失败要返回的值
     @result 返回NSInteger,获取失败为指定的defaultValue
     */
    - (NSInteger)integerForKey:(id)key defaultValue:(NSInteger)defaultValue;
    
    /*!
     @method unsignedIntegerForKey:
     @abstract 获取指定key的NSUInteger类型值
     @param key 键
     @result 返回NSUInteger,获取失败为0
     */
    - (NSUInteger)unsignedIntegerForKey:(id)key;
    
    /*!
     @method unsignedIntegerForKey:defaultValue:
     @abstract 获取指定key的NSUInteger类型值
     @param key 键
     @param defaultValue 获取失败要返回的值
     @result 返回NSUInteger,获取失败为指定的defaultValue
     */
    - (NSUInteger)unsignedIntegerForKey:(id)key defaultValue:(NSUInteger)defaultValue;
    
    /*!
     @method pointForKey:
     @abstract 获取指定key的CGPoint类型值
     @param key 键
     @result 返回CGPoint,获取失败为CGPointZero
     */
    - (CGPoint)pointForKey:(id)key;
    
    /*!
     @method pointForKey:defaultValue:
     @abstract 获取指定key的CGPoint类型值
     @param key 键
     @param defaultValue 获取失败要返回的值
     @result 返回CGPoint,获取失败为指定的defaultValue
     */
    - (CGPoint)pointForKey:(id)key defaultValue:(CGPoint)defaultValue;
    
    /*!
     @method sizeForKey:
     @abstract 获取指定key的CGSize类型值
     @param key 键
     @result 返回CGPoint,获取失败为CGSizeZero
     */
    - (CGSize)sizeForKey:(id)key;
    
    /*!
     @method sizeForKey:defaultValue:
     @abstract 获取指定key的CGSize类型值
     @param key 键
     @param defaultValue 获取失败要返回的值
     @result 返回CGSize,获取失败为指定的defaultValue
     */
    - (CGSize)sizeForKey:(id)key defaultValue:(CGSize)defaultValue;
    
    /*!
     @method rectForKey:
     @abstract 获取指定key的CGRect类型值
     @param key 键
     @result 返回CGPoint,获取失败为CGRectZero
     */
    - (CGRect)rectForKey:(id)key;
    
    /*!
     @method rectForKey:
     @abstract 获取指定key的CGRect类型值
     @param key 键
     @param defaultValue 获取失败要返回的值
     @result 返回CGRect,获取失败为指定的defaultValue
     */
    - (CGRect)rectForKey:(id)key defaultValue:(CGRect)defaultValue;
    
    @end
    
    
    
    @implementation NSDictionary (SHYUtil)
    
    + (NSDictionary *)dictionaryWithContentsOfData:(NSData *)data
    {
        CFPropertyListRef plist =  CFPropertyListCreateFromXMLData(kCFAllocatorDefault, (__bridge CFDataRef)data, kCFPropertyListImmutable, NULL);
        NSDictionary *result = (__bridge_transfer NSDictionary *)plist;
        if ([result isKindOfClass:[NSDictionary class]]) {
            return result;
        }
        else {
            CFRelease(plist);
            return nil;
        }
    }
    
    - (BOOL)isEmpty
    {
        return ([self count] == 0);
    }
    
    - (id)objectForKeyCheck:(id)aKey
    {
        if (aKey == nil) {
            return nil;
        }
        
        id value = [self objectForKey:aKey];
        if (value == [NSNull null]) {
            return nil;
        }
        return value;
    }
    
    - (id)objectForKeyCheck:(id)key class:(__unsafe_unretained Class)aClass
    {
        return [self objectForKeyCheck:key class:aClass defaultValue:nil];
    }
    
    - (id)objectForKeyCheck:(id)key class:(__unsafe_unretained Class)aClass defaultValue:(id)defaultValue
    {
        id value = [self objectForKeyCheck:key];
        if (![value isKindOfClass:aClass]) {
            return defaultValue;
        }
        return value;
    }
    
    - (NSArray *)arrayForKey:(id)key
    {
        return [self arrayForKey:key defaultValue:nil];
    }
    
    - (NSArray *)arrayForKey:(id)key defaultValue:(NSArray *)defaultValue
    {
        return [self objectForKeyCheck:key class:[NSArray class] defaultValue:defaultValue];
    }
    
    - (NSMutableArray *)mutableArrayForKey:(id)key
    {
        return [self mutableArrayForKey:key defaultValue:nil];
    }
    
    - (NSMutableArray *)mutableArrayForKey:(id)key defaultValue:(NSArray *)defaultValue
    {
        return [self objectForKeyCheck:key class:[NSMutableArray class] defaultValue:defaultValue];
    }
    
    - (NSDictionary *)dictionaryForKey:(id)key
    {
        return [self dictionaryForKey:key defaultValue:nil];
    }
    
    - (NSDictionary *)dictionaryForKey:(id)key defaultValue:(NSDictionary *)defaultValue
    {
        return [self objectForKeyCheck:key class:[NSDictionary class] defaultValue:defaultValue];
    }
    
    - (NSMutableDictionary *)mutableDictionaryForKey:(id)key
    {
        return [self mutableDictionaryForKey:key defaultValue:nil];
    }
    
    - (NSMutableDictionary *)mutableDictionaryForKey:(id)key defaultValue:(NSDictionary *)defaultValue
    {
        return [self objectForKeyCheck:key class:[NSMutableDictionary class] defaultValue:defaultValue];
    }
    
    - (NSData *)dataForKey:(id)key
    {
        return [self dataForKey:key defaultValue:nil];
    }
    
    - (NSData *)dataForKey:(id)key defaultValue:(NSData *)defaultValue
    {
        return [self objectForKeyCheck:key class:[NSData class] defaultValue:defaultValue];
    }
    
    - (NSString *)stringForKey:(id)key
    {
        return [self stringForKey:key defaultValue:nil];
    }
    
    - (NSString *)stringForKeyToString:(id)key
    {
        return [self stringForKey:key defaultValue:@""];
    }
    
    - (NSString *)stringForKey:(id)key defaultValue:(NSString *)defaultValue
    {
        id value = [self objectForKeyCheck:key];
        
        if ([value isKindOfClass:[NSNumber class]]) {
            return [value stringValue];
        }
        
        if (![value isKindOfClass:[NSString class]]) {
            return defaultValue;
        }
        return value;
    }
    
    - (NSNumber *)numberForKey:(id)key
    {
        return [self numberForKey:key defaultValue:nil];
    }
    
    - (NSNumber *)numberForKey:(id)key defaultValue:(NSNumber *)defaultValue
    {
        id value = [self objectForKeyCheck:key];
        
        if ([value isKindOfClass:[NSString class]]) {
            return [value numberValue];
        }
        
        if (![value isKindOfClass:[NSNumber class]]) {
            return defaultValue;
        }
        
        return value;
    }
    
    - (char)charForKey:(id)key
    {
        id value = [self objectForKeyCheck:key];
        if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) {
            return [value charValue];
        }
        else {
            return 0x0;
        }
    }
    
    - (unsigned char)unsignedCharForKey:(id)key
    {
        id value = [self objectForKeyCheck:key];
        if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) {
            return [value unsignedCharValue];
        }
        else {
            return 0x0;
        }
    }
    
    - (short)shortForKey:(id)key
    {
        return [self shortForKey:key defaultValue:0];
    }
    
    - (short)shortForKey:(id)key defaultValue:(short)defaultValue
    {
        id value = [self objectForKeyCheck:key];
        if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) {
            return [value shortValue];
        }
        else {
            return defaultValue;
        }
    }
    
    - (unsigned short)unsignedShortForKey:(id)key
    {
        return [self unsignedShortForKey:key defaultValue:0];
    }
    
    - (unsigned short)unsignedShortForKey:(id)key defaultValue:(unsigned short)defaultValue
    {
        id value = [self objectForKeyCheck:key];
        if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) {
            return [value unsignedShortValue];
        }
        else {
            return defaultValue;
        }
    }
    
    - (int)intForKey:(id)key
    {
        return [self intForKey:key defaultValue:0];
    }
    
    - (int)intForKey:(id)key defaultValue:(int)defaultValue
    {
        id value = [self objectForKeyCheck:key];
        if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) {
            return [value intValue];
        }
        else {
            return defaultValue;
        }
    }
    
    - (unsigned int)unsignedIntForKey:(id)key
    {
        return [self unsignedIntForKey:key defaultValue:0];
    }
    
    - (unsigned int)unsignedIntForKey:(id)key defaultValue:(unsigned int)defaultValue
    {
        id value = [self objectForKeyCheck:key];
        if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) {
            return [value unsignedIntValue];
        }
        else {
            return defaultValue;
        }
    }
    
    - (long)longForKey:(id)key
    {
        return [self longForKey:key defaultValue:0];
    }
    
    - (long)longForKey:(id)key defaultValue:(long)defaultValue
    {
        id value = [self objectForKeyCheck:key];
        if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) {
            return [value longValue];
        }
        else {
            return defaultValue;
        }
    }
    
    - (unsigned long)unsignedLongForKey:(id)key
    {
        return [self unsignedLongForKey:key defaultValue:0];
    }
    
    - (unsigned long)unsignedLongForKey:(id)key defaultValue:(unsigned long)defaultValue
    {
        id value = [self objectForKeyCheck:key];
        if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) {
            return [value unsignedLongValue];
        }
        else {
            return defaultValue;
        }
    }
    
    - (long long)longLongForKey:(id)key
    {
        return [self longLongForKey:key defaultValue:0];
    }
    
    - (long long)longLongForKey:(id)key defaultValue:(long long)defaultValue
    {
        id value = [self objectForKeyCheck:key];
        if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) {
            return [value longLongValue];
        }
        else {
            return defaultValue;
        }
    }
    
    - (unsigned long long)unsignedLongLongForKey:(id)key
    {
        return [self unsignedLongLongForKey:key defaultValue:0];
    }
    
    - (unsigned long long)unsignedLongLongForKey:(id)key defaultValue:(unsigned long long)defaultValue
    {
        id value = [self objectForKeyCheck:key];
        if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) {
            return [value unsignedLongLongValue];
        }
        else {
            return defaultValue;
        }
    }
    
    - (float)floatForKey:(id)key
    {
        return [self floatForKey:key defaultValue:0.0];
    }
    
    - (float)floatForKey:(id)key defaultValue:(float)defaultValue
    {
        id value = [self objectForKeyCheck:key];
        if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) {
            float result = [value floatValue];
            return isnan(result) ? defaultValue : result;
        }
        else {
            return defaultValue;
        }
    }
    
    - (double)doubleForKey:(id)key
    {
        return [self doubleForKey:key defaultValue:0.0];
    }
    
    - (double)doubleForKey:(id)key defaultValue:(double)defaultValue
    {
        id value = [self objectForKeyCheck:key];
        if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) {
            double result = [value doubleValue];
            return isnan(result) ? defaultValue : result;
        }
        else {
            return defaultValue;
        }
    }
    
    - (BOOL)boolForKey:(id)key
    {
        return [self boolForKey:key defaultValue:NO];
    }
    
    - (BOOL)boolForKey:(id)key defaultValue:(BOOL)defaultValue
    {
        id value = [self objectForKeyCheck:key];
        if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) {
            return [value boolValue];
        }
        else {
            return defaultValue;
        }
    }
    
    - (NSInteger)integerForKey:(id)key
    {
        return [self integerForKey:key defaultValue:0];
    }
    
    - (NSInteger)integerForKey:(id)key defaultValue:(NSInteger)defaultValue
    {
        id value = [self objectForKeyCheck:key];
        if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) {
            return [value integerValue];
        }
        else {
            return defaultValue;
        }
    }
    
    - (NSUInteger)unsignedIntegerForKey:(id)key
    {
        return [self unsignedIntegerForKey:key defaultValue:0];
    }
    
    - (NSUInteger)unsignedIntegerForKey:(id)key defaultValue:(NSUInteger)defaultValue
    {
        id value = [self objectForKeyCheck:key];
        if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) {
            return [value unsignedIntegerValue];
        }
        else {
            return defaultValue;
        }
    }
    
    - (CGPoint)pointForKey:(id)key
    {
        return [self pointForKey:key defaultValue:CGPointZero];
    }
    
    - (CGPoint)pointForKey:(id)key defaultValue:(CGPoint)defaultValue
    {
        id value = [self objectForKeyCheck:key];
        if ([value isKindOfClass:[NSString class]] && ![value isEmpty])
            return CGPointFromString(value);
        else if ([value isKindOfClass:[NSValue class]])
            return [value CGPointValue];
        else
            return defaultValue;
    }
    
    - (CGSize)sizeForKey:(id)key
    {
        return [self sizeForKey:key defaultValue:CGSizeZero];
    }
    
    - (CGSize)sizeForKey:(id)key defaultValue:(CGSize)defaultValue
    {
        id value = [self objectForKeyCheck:key];
        if ([value isKindOfClass:[NSString class]] && ![value isEmpty])
            return CGSizeFromString(value);
        else if ([value isKindOfClass:[NSValue class]])
            return [value CGSizeValue];
        else
            return defaultValue;
    }
    
    - (CGRect)rectForKey:(id)key
    {
        return [self rectForKey:key defaultValue:CGRectZero];
    }
    
    - (CGRect)rectForKey:(id)key defaultValue:(CGRect)defaultValue
    {
        id value = [self objectForKeyCheck:key];
        if ([value isKindOfClass:[NSString class]] && ![value isEmpty])
            return CGRectFromString(value);
        else if ([value isKindOfClass:[NSValue class]])
            return [value CGRectValue];
        else
            return defaultValue;
    }
    1
  • 相关阅读:
    【OpenCV学习笔记5】读取图像中任意点的像素值
    【收藏】国企央企
    Visual Studio 进化史
    【图像算法】不变矩
    工控博客精华链接
    投了...
    【图像算法】常见的数字图像处理程序大全
    Google C++编码规范
    Google员工自述:在哈佛教书和在Google工作的差别
    国立华侨大学校长写给2010届毕业生的话:人生的二和三
  • 原文地址:https://www.cnblogs.com/fantasy3588/p/5072370.html
Copyright © 2020-2023  润新知