iOS 开发学习39 简单学习反射的部分用法
2015-06-25 13:35
671 查看
内省
在程序运行时获取对象的类型。遍历属性
unsigned int outCount,i; objc_property_t *properties = class_copyPropertyList([self class], &outCount); NSMutableArray *keys = [[NSMutableArray alloc] initWithCapacity:outCount]; for (i = 0; i < outCount; i++) { objc_property_t property = properties[i]; NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property) encoding:NSUTF8StringEncoding]; [keys addObject:propertyName]; } free(properties);
给对象自动赋值的代码
- (NSArray*)propertyKeys { unsigned int outCount, i; objc_property_t *properties = class_copyPropertyList([self class], &outCount); NSMutableArray *keys = [[NSMutableArray alloc] initWithCapacity:outCount]; for (i = 0; i < outCount; i++) { objc_property_t property = properties[i]; NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property) encoding:NSUTF8StringEncoding]; [keys addObject:propertyName]; } free(properties); return keys; } - (BOOL)reflectDataFromOtherObject:(NSObject*)dataSource { BOOL ret = NO; for (NSString *key in [self propertyKeys]) { if ([dataSource isKindOfClass:[NSDictionary class]]) { ret = ([dataSource valueForKey:key]==nil)?NO:YES; } else { ret = [dataSource respondsToSelector:NSSelectorFromString(key)]; } if (ret) { id propertyValue = [dataSource valueForKey:key]; //该值不为NSNULL,并且也不为nil if (![propertyValue isKindOfClass:[NSNull class]] && propertyValue!=nil) { [self setValue:propertyValue forKey:key]; } } } return ret; } /////使用方法 NSDictionary *dicJsonData; EntityObject *objValue; [objValue reflectDataFromOtherObject:dicJsonData];//这样就可以完成对象的自动赋值了,
根据类的名称创建实例
Class classname=NSClassFromString(@"ClassName"); id obj=[[classname alloc]init]; //调用方法 SEL selector = NSSelectorFromString(@"CallFunc"); [obj performSelector:selector withObject:nil];
获取方法的指针
IMP test = [self methodForSelector:@selector(start)]; test();
判断是否是类或子类的实例
-(BOOL)isKindOfClass:classObj
判断是否是这个类的实例
-(BOOL)isMemberOfClass:classObj
判断是否响应指定消息
原型: -(BOOL)respondsToSelector:(SEL)aSelector 示例: if ([self respondsToSelector:@selector(test)]) { NSLog(@"YES"); } else { NSLog(@"NO"); }
判断是否符合指定协议
原型: -(BOOL)conformsToProtocol:(Protocal *)aProtocal 示例: if ([self conformsToProtocol:@protocol(NSObject)]) { NSLog(@"YES"); } else { NSLog(@"NO"); }
获取类名
NSString *className = NSStringFromClass([theObject class]);
相关文章推荐
- ios无线轮播图
- IOS中的XML解析之DOM和SAX
- ios 程序崩溃时捕获到异常信息
- iOS 8 Xcode6 设置Launch Image 启动图片
- iOS的过程方法与执行方法
- StoryBoard下ScrollView如何添加约束
- IOS字典转模型
- iOS CALayer 抖动效果
- iOS 开发消息推送(APNS)
- iOS下的RSA加密方法
- iOS百度地图辅助配置文档
- ios开发中常用小技巧
- IOS中的XML解析之DOM和SAX
- 在IOS开发中使用定位
- iOS——Xcode上的Other linker flags
- 关于iOS Push总结
- iOS 图片的属性
- iOS开发中KVO & KVC的使用
- iOS在线播放--影音播放的两个方式
- iOS_开发中遇到的那些问题_1