Objective-C运行时中类似IBOutlet的构造

Objective-C运行时中类似IBOutlet的构造,objective-c,objective-c-runtime,Objective C,Objective C Runtime,我对IBOutlets的理解是,它们在Objective-C类中充当IVAR和属性的标记。Objective-C运行时中是否有任何东西允许用户在运行时查询ivar、属性或类是否已标记为IBOutlet?或者XCode只是在编译时巧妙地处理了这些问题 如果它们是运行时构造,是否可以定义自己的标记并以这种方式使用它们: @private MyMarker MyClass instance; 据我所知,Interface Builder只读取头文件。IBOutlet和IBAction是微不足

我对IBOutlets的理解是,它们在Objective-C类中充当IVAR和属性的标记。Objective-C运行时中是否有任何东西允许用户在运行时查询ivar、属性或类是否已标记为IBOutlet?或者XCode只是在编译时巧妙地处理了这些问题

如果它们是运行时构造,是否可以定义自己的标记并以这种方式使用它们:

@private
    MyMarker MyClass instance;

据我所知,Interface Builder只读取头文件。IBOutlet和IBAction是微不足道的#定义:

这根本不会影响编译。Interface Builder直接读取头文件(当头文件更改时,但它只读取和解析头文件本身)

当清除nib文件时,通过普通接口使用ivar或属性设置值,但没有特别注意到接口生成器可以使用ivar/属性

因此,IBOutlet/IBAction属性的存在不是存储的,也不能访问,您也不能添加自己的属性


您可以查看属性,看看是否有任何有用的东西可以通过属性附加到ivar,但我会非常惊讶。

是的,IBOutlet和IBAction只是在预编译阶段被解析器丢弃,因此编译输出中没有任何内容。如上所述,它们只是由Inte进行文本处理rface Builder,以便它知道哪些属性/方法子集可用于“连接”窗口

然而,这并不能阻止你自己做同样的事情——你可以定义一些被预处理器编译掉的#define,并使用文本处理来操作它们。但是这些在运行时都不可用,这意味着你不能真正按照你的建议去做

从技术上讲,可以编写一个宏,对属性/ivar进行一些操作,然后向不同的ivar添加额外信息;例如:

#define OUTLET(type,name) type name;BOOL property_##name;
@interface Foo : NSObject
{
        OUTLET(NSString*,foo);
}
@end
将扩展到

@interface Foo :NSObject
{
    NSString* foo;
    BOOL property_foo;
}
@end
然后,您可以使用属性_foo的存在来处理代码(在运行时和编译时都可以检测到)

不过,我不建议一般地尝试这样做……首先,它会使您的接口(以及内存对象)比需要的更大。您最好创建自己的类(或struct typedef)来保存所需的其他信息

@interface Foo :NSObject
{
    NSString* foo;
    BOOL property_foo;
}
@end