【问题标题】:Why iOS cannot get subviews property for class UIView using class_getProperty function?为什么 iOS 无法使用 class_getProperty 函数获取类 UIView 的子视图属性?
【发布时间】:2012-06-28 05:00:57
【问题描述】:

我想获取关于UIView类的subviews属性的信息:

objc_property_t property = class_getProperty([UIView class], "subviews");

但是,它返回零?我觉得这太奇怪了。有人可以向我解释这种行为吗?

【问题讨论】:

  • 奇怪...valueForKey: 显示正确。

标签: objective-c uiview runtime subviews


【解决方案1】:

很奇怪。如果你使用-valueForKey:,可以清楚地显示它存在。这曾经是 Xcode 3.2.3 中旧 LLVM clang 编译器的一个错误,其中类别中的属性(是的,它在 UIView 上的类别中声明)不会被运行时识别,甚至还有一个错误报告提交here 关于它。我知道最近版本的 Xcode 在分类方面遇到了问题......

【讨论】:

  • 我无法用我自己的课程重现它......绝对不是那个老错误(以为是,但事实并非如此)。我想知道 UIView.h 是否可能是一个谎言。有可能他们实际上并没有针对该标头进行编译(看起来很疯狂,但是嘿......)
  • 我可以在运行 Xcode DP2 的机器上重现它。您可能是对的,但是,我倾向于认为这是一个编译器错误。
  • 我使用的是 Xcode 4.3.3。因此类别中的属性也会显示在运行时的属性列表中。但是文档中的 subviews 属性丢失了。
  • 那么他们肯定使用了某种#include_next。除了提交错误报告,我不知道该说什么。
  • 请注意valueForKey: 和“property”是完全不相关的。方法subviews 绝对存在。它只是不是“财产”。如果您class_copyMethods(),它会显示出来。当然,在编译 UIView 时可能存在编译器错误。到目前为止,我还无法用我自己的类(即没有 UIView)重现这种效果。 CodaFi,你是说你可以吗?我当然可以用 UIView 重现它。
【解决方案2】:

我只是写了一个测试代码:

@interface Cat : NSObject
    @property (nonatomic, strong) NSString *name;
    @property (nonatomic) NSInteger         age;
    @property (nonatomic, readonly, copy)   NSArray *subviews;
@end

没关系。所以我猜苹果可能会在这方面做得这么神奇。

【讨论】:

  • 用一个类别测试它。它必须是一个类别。
  • 我使用类别进行了测试,例如接口 Cat (UIViewSimuate) 属性(非原子,强) NSArray *subviews; end 并使用 NSClassFromString 函数获取类,不包括头文件。同理,子视图出现在属性列表中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2019-03-25
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
相关资源
最近更新 更多