具有现代目标-C的受保护变量?

我觉得现代的Objective-C鼓励使用实例变量作为内存管理和键值观察的属性.这工作正常,我在实现文件中使用接口用于私有变量,如下所示:
@interface MyClass ()
@property NSObject* myVar;
@end

但是,我如何制作受保护的变量?在上面的例子中,我的子类将无法看到像这样声明的属性.我可以去iVar路线,但是如果私有变量被声明为上面并且受保护的是iVars,那么它会感觉到其余的代码.

我已经阅读了这个解决方案:Workaround to accomplish protected properties in Objective-C,但它似乎过多地复杂了代码.

解决方法

您最好的选择是在第二个头文件中使用一个类别,例如MyClass_protected.h,并将其包含在主类和子类中,如您链接解决方案中所建议的那样.这真的很简单,根本不是“过于复杂”,只是一个额外的文件.

Objective-C具有很强的内省特征.无论您如何或在何处声明属性(或任何其他功能),您都可以从任何地方访问它.除非您编写的代码可以看到相应的声明或实现(除非您使用像performSelector …系列之一那样的内省方法),否则您将收到编译器警告.接口的唯一原因是名称安全,类型安全和防止编译器警告.因此,您有几个选择:

主类接口

您可以获得实现安全性(即如果您不实现方法,编译器将发出警告).但是,每个类(导入您的类)都会看到这些方法.您可以使用注释来指示该方法应该受到保护,但当然除非他们检查源,否则没有人会看到它.当我是项目中唯一的程序员时,我经常使用它,因为我知道应该保护什么,不应该保护什么.

同一.h文件中的类别

如上所述,程序员不会看到它受到保护,除非他们检查源,但如果他们这样做将更加明显.如果在命名类别(@interface MyClass(protected))中声明它,则会失去类型安全性,但更清楚您的意图.我经常使用它来模拟抽象方法 – 即显然不是实现安全的,但应该对每个人都可见.

子类的.m文件中的类别

这是一个坏主意,不要这样做.你只看到子类中的方法,但是你失去了实现的安全性而且它确实感觉不对.我只使用它进行单元测试,最终我将它们迁移到一个单独的标题中.

单独标题中的类别(MyClass_protected.h)

首选解决方案和最接近的Objective-C可以获得受保护的方法.它只是一个文件,严重的是,不要把你的内裤放在一堆.您可以使用类扩展(它们是匿名类别),您不会失去实现安全性.它只对包含它的类可见,它应该只是子类;除了最不称职的程序员之外,由于标题名称,所包含的方法旨在用作受保护的这一事实应该是显而易见的.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...