将受保护的 Objective-C 实例变量公开给子类

Posted

技术标签:

【中文标题】将受保护的 Objective-C 实例变量公开给子类【英文标题】:Expose a protected Objective-C instance variable to subclass 【发布时间】:2015-04-08 07:33:48 【问题描述】:

我正在继承一个 pod 的类,在这个类中有一个私有实例变量,我想在我的类中公开和使用它:

@interface MySuperClass () 
    UIScrollView *_scrollView;

通常在公开私有成员或方法时,我会使用前面提到的here 之类的类别,但我在使用私有实例变量时遇到了问题。我读到 here 说关联引用可能会起作用,但我无法让它起作用。

【问题讨论】:

你实现this了吗? @Mundi 我试过了,但它对我不起作用,也许我在实现它时犯了一个错误。 我不认为你可以。 anInstanceOfMySuperClass._scrollView 是不可能的,因为点符号用于访问属性。如果你真的想这样做,也许你可以编写一个 setter 和 getter 方法来模拟这种行为。 【参考方案1】:

尝试在子类中实现:

- (UIScrollView *)scrollView 
    return [self valueForKey:@"_scrollView"]

【讨论】:

【参考方案2】:

不幸的是,在 Objective-C 中没有办法声明私有实例变量。

无论您希望您的子类能够看到什么,您都必须在您的.h-文件中声明。您所说的关联引用以完全相同的方式工作,但它们解决了一个不同的问题,即在 category 中声明实例变量。

这是由于语言的设计,我想.m 文件实际上是 实现 文件的方式是有意义的,并且没有其他类实际上应该关心另一个,即使有继承关系,如子类化。

您可以选择使用该 pod 类的私有实例变量,或者将其放入属性中,或者确实实现一个 category,您可以在其中添加访问它的方法。

【讨论】:

我尝试实现一个包含私有实例的类别,但没有成功。

以上是关于将受保护的 Objective-C 实例变量公开给子类的主要内容,如果未能解决你的问题,请参考以下文章

Jetty 9.4.38 将受监控的路径(上下文)公开为自己的上下文

将受保护字段限制为当前汇编 c# vb.net

在不安装 Java 的情况下将受密码保护的 xlsx 文件读入 R(密码已知)

从 Objective-C 向 Swift 公开一个常量变量

实例变量修饰符

17:实例变量修饰符