동적 매핑objective-c의 대상 방법 빈 바늘 수정

3351 단어
배경: 현재 iOS 프로젝트는 json 데이터를 하나의 대상으로 변환하여 저장하는 경우가 많다.이 대상에 myName이라는 Attributes가 있다고 가정하면, 이 Attributes는 줄곧 nil이며, 이 대상을 만든 후에 값을 부여하는 것을 잊어버립니다.이제 함수를 통해 그를 검출하고 @ "으로 값을 부여합니다.
또한 NSString 형식이고 Attributes가 nil이면 @ "값을 부여하는 Attributes가 몇 개인지 모릅니다.
코드는 다음과 같습니다.
//
//  GMCommonHelper.h
#import 
#import 
@interface GMCommonHelper : NSObject
+(void)fixNilData:(id)kClass;
@end
//
//  GMCommonHelper.m
#import 
#import “GMCommonHelper.h"
@implementation GMCommonHelper
+(void)fixNilData:(id)kClass
{
    unsigned int propertyCount = 0;
    objc_property_t *properties = class_copyPropertyList([kClass class], &propertyCount);
    
    for (unsigned int i = 0; i < propertyCount;++i) {
        objc_property_t property = properties[i];
        
        const char * name = property_getName(property);
        const char * attrs = property_getAttributes(property);
        NSString * utf8Name = [NSString stringWithUTF8String:name];
        NSString * utf8Attrs = [NSString stringWithUTF8String:attrs];
        id propertVal = [kClass valueForKey:utf8Name];
        if (!propertVal && [utf8Attrs hasPrefix:@"T@\"NSString\""]) {
            [kClass setValue:@"" forKey:utf8Name];
        }
    }
    free(properties);
}
//———————————————————————
- (void)releaseProperties { unsigned int c = 0; objc_property_t *properties = class_copyPropertyList([self class], &c); for(unsigned int i = 0; i < c; i++) { objc_property_t property = properties[i]; NSString *propertyName = [NSString stringWithUTF8String:property_getName(property)]; NSString *propertyType = [NSString stringWithUTF8String:property_getAttributes(property)]; if([propertyType hasPrefix:@"T@"]//is an object && [propertyType rangeOfString:@",R,"].location == NSNotFound//not readonly ) { [self setValue:nil forKey:propertyName]; NSLog(@"%@.%@ = %@", NSStringFromClass(cls), propertyName, [self valueForKey:propertyName]); } } free(properties);}
//———————————————————————
If you only care about classes you can use  isKindOfClass: , but if you want to deal with scalars you are correct that you need to use  property_getAttributes() , it returns a string that encodes the type information. Below is a basic function that demonstrates what you need to do. For examples of encoding strings, look here.
unsigned int outCount, i;
objc_property_t *properties = class_copyPropertyList([object class], &outCount);
for (i = 0; i < outCount; i++) {
    objc_property_t property = properties[i];
    char *property_name = property_getName(property);
    char *property_type = property_getAttributes(property);

    switch(property_type[1]) {
      case 'f' : //float
        break;
      case 's' : //short
        break;
      case '@' : //ObjC object
        //Handle different clases in here
        break;
    }
}

Obvviously you will need to add all the types and classes you need to handle to this, it uses the normal ObjC @encode type.

좋은 웹페이지 즐겨찾기