1. class反射
使用反射往往不需要導(dǎo)入頭文件, 就可以剔除一些對(duì)象. 類似于分類, 不導(dǎo)入也會(huì)調(diào)用其中的 load 方法.
- 通過類名的字符串形式實(shí)例化對(duì)象蒿往。
Class class = NSClassFromString(@"student");
Student *stu = [[class alloc] init];
- 將類名變?yōu)樽址?/li>
Class class =[Student class];
NSString *className = NSStringFromClass(class);
2. SEL的反射
使用@selector 在編譯時(shí)查找所需的方法
- 通過方法的字符串形式實(shí)例化方法烂叔。
SEL selector = NSSelectorFromString(@"setName");
[stu performSelector:selector withObject:@"Mike"];
[[Person class] performSelectorOnMainThread:@selector(eat) withObject:nil waitUntilDone:YES];
- 將方法變成字符串蔓彩。
NSStringFromSelector(@selector(setName:));
3. class 反射使用場(chǎng)景一: 使用簡單的代號(hào)枚舉類名
- 適用于使用簡單的枚舉類型或字符串, 匹配類名, 方便獨(dú)立快捷地創(chuàng)建各自的類.
- 優(yōu)點(diǎn)是, 不需要考慮類的具體名稱, 直接按照類名對(duì)應(yīng)的 key 來查找即可, 可以把 key 定義得通俗易懂, 方便代碼的維護(hù).
+ (NSDictionary*)modeList
{
return @{@"1":[PTVRoomContentMode defaultModeName],
STYLE_TYPE_ROOM_307 : @"PTVPandaRoomContentModel",
STYLE_TYPE_CAT_TEAM : @"PTVCatBrigadeContentModel",
STYLE_TYPE_ESPORTS : @"PTVESportsContentModel",
};
}
調(diào)用方式如下:
NSString* modename = [[PTVRoomContentMode modeList] objectForKey:style_type];
PTVRoomContentMode* mode = [NSClassFromString(modename) new];
4. class 反射使用場(chǎng)景二: 遍歷plist里面的字符串, 生成目標(biāo)的類.
對(duì)于繼承自同一個(gè)父類(如 NSObject )的多個(gè)子模塊, 或遵守同一個(gè)協(xié)議(如 <NSObject> )的子模塊, 可以將類名保存在 plist 文件里面, 按需創(chuàng)建子模塊.
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];
}