iOS 面试题专栏

138 阅读1分钟

iOS反射

反射是什么?可以举出几个应用场景么?

由于OC语言的动态性,反射即为类名、方法名、属性名和字符串在运行时相互转化的能力。

系统Foundation框架为我们提供了一些方法反射的API:
// SEL和字符串转换

FOUNDATION_EXPORT NSString *NSStringFromSelector(SEL aSelector);

FOUNDATION_EXPORT SEL NSSelectorFromString(NSString *aSelectorName);

// Class和字符串转换

FOUNDATION_EXPORT NSString *NSStringFromClass(Class aClass);

FOUNDATION_EXPORT Class __nullable NSClassFromString(NSString *aClassName);

// Protocol和字符串转换

FOUNDATION_EXPORT NSString *NSStringFromProtocol(Protocol *proto) NS_AVAILABLE(10_5, 2_0);

FOUNDATION_EXPORT Protocol * __nullable NSProtocolFromString(NSString *namestr) NS_AVAILABLE(10_5, 2_0);

通过这些方法,我们可以在运行时选择创建那个实例,并动态选择调用哪个方法。这些操作甚至可以由服务器传回来的参数来控制,我们可以将服务器传回来的类名和方法名,实例为我们的对象。

应用场景:
  1. 代码模块化、解耦代码。
  2. 后台动态下发类名方法名,动态地决定调用情况。