面试题答案
一键面试使用@encode()获取类型编码
- 基本类型:对于简单的基本类型,如
int
、float
、BOOL
等,直接使用@encode()
即可。例如:
char intEncoding = @encode(int);
char floatEncoding = @encode(float);
char boolEncoding = @encode(BOOL);
- 自定义对象:对于自定义对象,
@encode()
返回@
加上对象的类名。例如,假设有一个自定义类MyClass
:
@interface MyClass : NSObject
@end
char myClassEncoding = @encode(MyClass);
- 多层嵌套的自定义对象:如果存在多层嵌套,例如一个类
OuterClass
包含一个InnerClass
类型的属性:
@interface InnerClass : NSObject
@end
@interface OuterClass : NSObject
@property (nonatomic, strong) InnerClass *innerObject;
@end
char outerClassEncoding = @encode(OuterClass);
这里outerClassEncoding
的类型编码会反映出其包含InnerClass
对象。
4. 泛型:在Objective - C中,泛型是通过类型参数实现的。例如NSArray<NSString *>
,@encode()
会将其编码为@"NSArray<NSString *>"
。可以通过以下方式获取:
id array = @[@"string"];
char arrayEncoding = @encode(__typeof(array));
- 协议扩展:协议扩展本身不直接影响
@encode()
对包含该协议类型的编码。如果一个类遵循某个协议,例如MyProtocol
,并且使用了协议扩展:
@protocol MyProtocol <NSObject>
@end
@interface MyObj : NSObject <MyProtocol>
@end
char myObjEncoding = @encode(MyObj);
编码会正常反映MyObj
的类型,协议扩展的额外方法不会在@encode()
的编码中特别体现。
处理类型编码时可能遇到的挑战及解决方案
- 可读性问题:类型编码通常是一串难以阅读的字符。
- 解决方案:可以使用苹果官方文档中关于类型编码的说明来解读。例如,
@
表示对象,i
表示int
等。另外,也可以编写工具方法来解析编码并以更易读的方式展示。
- 解决方案:可以使用苹果官方文档中关于类型编码的说明来解读。例如,
- 跨平台兼容性:不同平台可能对某些类型编码有细微差异。
- 解决方案:在编写依赖类型编码的代码时,进行充分的跨平台测试。确保在所有目标平台(如iOS、macOS等)上都能正确处理类型编码。
- 复杂结构解析:对于多层嵌套和复杂的泛型结构,解析编码可能变得非常困难。
- 解决方案:将复杂类型编码的解析逻辑封装成函数或类方法,逐步解析各个部分。例如,先解析外层容器类型(如
NSArray
、NSDictionary
),再解析内部元素类型。同时,结合运行时的元数据信息(如class_getInstanceVariable
等函数)来辅助解析。
- 解决方案:将复杂类型编码的解析逻辑封装成函数或类方法,逐步解析各个部分。例如,先解析外层容器类型(如