iOS 反射

1. class反射

使用反射往往不需要导入头文件, 就可以剔除一些对象. 类似于分类, 不导入也会调用其中的 load 方法.

  1. 通过类名的字符串形式实例化对象。
Class class = NSClassFromString(@"student"); 
Student *stu = [[class alloc] init];
  1. 将类名变为字符串。
Class class =[Student class];
NSString *className = NSStringFromClass(class);

2. SEL的反射

使用@selector 在编译时查找所需的方法

  1. 通过方法的字符串形式实例化方法。
SEL selector = NSSelectorFromString(@"setName");  
[stu performSelector:selector withObject:@"Mike"];
[[Person class] performSelectorOnMainThread:@selector(eat) withObject:nil waitUntilDone:YES];
  1. 将方法变成字符串。
NSStringFromSelector(@selector(setName:));

3. class 反射使用场景一: 使用简单的代号枚举类名

  1. 适用于使用简单的枚举类型或字符串, 匹配类名, 方便独立快捷地创建各自的类.
  2. 优点是, 不需要考虑类的具体名称, 直接按照类名对应的 key 来查找即可, 可以把 key 定义得通俗易懂, 方便代码的维护.
+ (NSDictionary*)modeList
{
   return @{@"1":[PTVRoomContentMode defaultModeName],
            STYLE_TYPE_ROOM_307 : @"PTVPandaRoomContentModel",
            STYLE_TYPE_CAT_TEAM : @"PTVCatBrigadeContentModel",
            STYLE_TYPE_ESPORTS : @"PTVESportsContentModel",
            };
}

调用方式如下:

NSString* modename = [[PTVRoomContentMode modeList] objectForKey:style_type];
PTVRoomContentMode* mode = [NSClassFromString(modename) new];

4. class 反射使用场景二: 遍历plist里面的字符串, 生成目标的类.

对于继承自同一个父类(如 NSObject )的多个子模块, 或遵守同一个协议(如 <NSObject> )的子模块, 可以将类名保存在 plist 文件里面, 按需创建子模块.

NSArray<NSString *> *moduleNames = [NSArray arrayWithContentsOfFile:plistFile];
for (NSString* class in moduleNames) {
        if (![class isKindOfClass:[NSString class]])
            continue;
        
        PXXRoomModule* module = [NSClassFromString(class) new];
        [self loadModule:module];
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,789评论 0 9
  • 前言:面试笔试都是必考语法知识点。请认真复习和深入研究OC。 目录:iOS-面试题-OC基础篇 (1) - (84...
    麦穗0615阅读 4,276评论 0 33
  • 了解反射机制 Objective-C语言中的OC对象,都继承自NSObject类。这个类为我们提供了一些基础的方法...
    呦释原点阅读 1,393评论 0 7
  • 该文章属于刘小壮原创,转载请注明:刘小壮[https://www.jianshu.com/u/2de707c93d...
    刘小壮阅读 46,539评论 45 151
  • 那天我把自己灌醉了 沉浸在醉的世界里 我可以好好地睡觉,无所顾忌地玩,没心没肺地笑……
    怀羽琋阅读 150评论 0 0