【问题标题】:Checking whether an ObjC property is nullable at runtime检查 ObjC 属性在运行时是否可以为空
【发布时间】:2017-08-22 10:46:25
【问题描述】:

我试图在运行时确定一个类的属性是否可以为空。例如:

@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

【问题讨论】:

  • nullable 修饰符只是给编译器的信息,帮助它为 Swift 提供适当的接口;它不会修改编译后的代码。
  • 据我所知,您无法使用class(+) 函数获取声明的变量值。如果有任何问题,请检查您的代码。
  • 预编译脚本来抓取属性信息并插入方法decl? libclang 很容易使用,虽然我不知道它是否公开了这个属性。

标签: objective-c nullable introspection declared-property


【解决方案1】:

从技术上讲,每个 Objective-C 指针或对象属性在运行时都可以为空。可空性说明符只是编译器提示,不会影响实际构建的二进制文件由编译器和链接器格式化,其中包含表示程序逻辑的机器指令以及其他信息和元数据]。因此,无法在运行时检测哪些属性可以为空,哪些不能。

【讨论】:

  • +1 除了因此之外完全正确。有时您可以在运行时获取类型信息,这对运行时环境的工作本身并不重要。
  • @Amin Negm-Awad 不可为空。该信息在运行时不存在。
  • 我知道。但是您说,这不可用,因为(因此)它只是一个编译器提示。但这不是一个有效的论点。
  • @Amin Negm-Awad 仅作为编译器提示,不会影响已编译的二进制文件,根据定义,您在运行时无法检测到。
  • 这是不正确的,因为 RTTI 可以而且比仅提供必要的信息更丰富。例如,将指针(指向 C 对象)传递给方法,指针的类型不会影响可执行文件。但是,您可以要求该类型。你的结论,即没有必要的东西不存在,是不正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 2014-08-22
  • 2022-12-05
  • 1970-01-01
  • 2017-12-26
相关资源
最近更新 更多