gpt4 book ai didi

objective-c - 在 Objective c 中公开/合成 iVar 属性

转载 作者:太空狗 更新时间:2023-10-30 04:02:24 26 4
gpt4 key购买 nike

我有一个类,它本质上充当另一个类的轻量级包装类。它将其他类作为 iVar。我希望能够公开 iVar 的某些属性(实际上有很多),但为此我必须像这样写出每个属性访问器:

- (void) setProperty:(Class *)value{
_iVar.property = value;
}
- (Class *) property{
return _iVar.property;
}

当然,我必须为每个属性都执行此操作,这很痛苦(大约有 30 个)。我很想能够合成这个,但我一直无法弄清楚如何合成。

是否可以合成?

另外,我不能子类化……好吧,我也许可以,但真的不推荐。 iVar 类真的很重(它实现了 CoreText)。我宁愿手写这些方法。

最佳答案

好的,这就是我找到的解决方案...一旦您知道该怎么做,就会变得非常简单。首先覆盖 '- (id) forwardingTargetForSelector:(SEL)aSelector' 并返回 iVar:

- (id) forwardingTargetForSelector:(SEL)aSelector{
return iVar;
}

当运行时正在寻找一个方法而找不到时,它会调用这个方法来查看是否有另一个对象可以将消息转发到。请注意,此方法通常返回 nil,如果您在此处返回 nil,您的程序将崩溃(这是适当的行为)。

问题的第二部分是隐藏当您尝试发送未声明的消息时收到的编译器错误/警告。这很容易通过声明一个您不实现的类别来完成。

@interface Class (iVarClassMethods)
@propoperty (strong) Class *property1;
......more properties
@end

只要您不在任何地方放置实现,也就是 @implementation Class (category),编译器就不会报错(它会假定实现在某处 ....).

现在我看到的唯一缺点是,如果您更改 iVar 类接口(interface)中的任何属性,您需要确保更新所有其他使用上述方法的类,否则当另一个类时您会崩溃尝试发送现在是错误的方法(并且编译器不会事先警告您)。然而,这可以绕过。您可以在类别中声明协议(protocol)。因此,您改为为 iVar 类创建一个单独的协议(protocol),并将您希望的方法/属性从 iVar 类移到协议(protocol)中。

@protocol iVarClassProtocol
@propoperty (strong) Class *property1;
......more properties
@end

将该协议(protocol)添加到 iVar 子类,以便它现在具有通过该协议(protocol)声明的那些方法。

@interface iVarClass <iVarClassProtocol>
....other methods/properties you don't need forwarded
@end

最后,只需将协议(protocol)添加到类别中即可。因此,您将拥有:

@interface Class (iVarClassMethods) <iVarClassProtocol>
@end

现在,如果您需要更改任何待转发的属性/方法,您可以在协议(protocol)中更改它们。然后,当您尝试将错误的方法发送到转发类时,编译器会警告您。

关于objective-c - 在 Objective c 中公开/合成 iVar 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9415694/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com