1. class反射
使用反射往往不需要導入頭文件, 就可以剔除一些對象. 類似于分類, 不導入也會調用其中的 load 方法.
- 通過類名的字符串形式實例化對象。
Class class = NSClassFromString(@"student");
Student *stu = [[class alloc] init];
- 將類名變為字符串。
Class class =[Student class];
NSString *className = NSStringFromClass(class);
2. SEL的反射
使用@selector 在編譯時查找所需的方法
- 通過方法的字符串形式實例化方法。
SEL selector = NSSelectorFromString(@"setName");
[stu performSelector:selector withObject:@"Mike"];
[[Person class] performSelectorOnMainThread:@selector(eat) withObject:nil waitUntilDone:YES];
- 將方法變成字符串。
NSStringFromSelector(@selector(setName:));
3. class 反射使用場景一: 使用簡單的代號枚舉類名
- 適用于使用簡單的枚舉類型或字符串, 匹配類名, 方便獨立快捷地創建各自的類.
- 優點是, 不需要考慮類的具體名稱, 直接按照類名對應的 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];
}