检查ObjC属性在运行时是否可为空

时间:2017-08-22 10:46:26

标签: objective-c nullable introspection declared-property

我试图在运行时弄清楚类的属性是否可以为空。例如:

@interface A : NSObject

+ (NSSet<NSString *> *)nullableProperties;

@property (readonly, nonatomic) NSString *description;

@property (readonly, nonatomic, nullable) NSError *error;

@end

@implementation A

+ (NSSet<NSString *> *)nullableProperties {
  // Code that identifies nullable properties.
}

@end
在这种情况下,

nullableProperties应该返回NSSet @"error"

property_getAttributes函数可以提供一些属性的信息(更多信息here)。不幸的是,它没有提供有关该属性是否被声明为可空的信息。

我想避免为每个需要知道可空属性的类实现nullableProperties

1 个答案:

答案 0 :(得分:5)

每个Objective-C指针或对象属性在运行时在技术上都可以为空。可空性说明符只是简单的编译器提示,不会影响实际构建的二进制文件[编辑:我的意思是,因为这显然不清楚,在Mach-O或其他一些文件中写入磁盘的1和0编译器和链接器的可比二进制格式,包含表示程序逻辑以及其他信息和元数据的机器指令。因此,没有办法在运行时检测哪些属性可以为空,哪些属性不可用。