@interface MyClass () @property NSObject* myVar; @end
但是,我如何制作受保护的变量?在上面的例子中,我的子类将无法看到像这样声明的属性.我可以去iVar路线,但是如果私有变量被声明为上面并且受保护的是iVars,那么它会感觉到其余的代码.
我已经阅读了这个解决方案:Workaround to accomplish protected properties in Objective-C,但它似乎过多地复杂了代码.
解决方法
Objective-C具有很强的内省特征.无论您如何或在何处声明属性(或任何其他功能),您都可以从任何地方访问它.除非您编写的代码可以看到相应的声明或实现(除非您使用像performSelector …系列之一那样的内省方法),否则您将收到编译器警告.接口的唯一原因是名称安全,类型安全和防止编译器警告.因此,您有几个选择:
主类接口
您可以获得实现安全性(即如果您不@R_301_369@,编译器将发出警告).但是,每个类(导入您的类)都会看到这些方法.您可以使用注释来指示该方法应该受到保护,但当然除非他们检查源,否则没有人会看到它.当我是项目中唯一的程序员时,我经常使用它,因为我知道应该保护什么,不应该保护什么.
同一.h文件中的类别
如上所述,程序员不会看到它受到保护,除非他们检查源,但如果他们这样做将更加明显.如果在命名类别(@interface MyClass(protected))中声明它,则会失去类型安全性,但更清楚您的意图.我经常使用它来模拟抽象方法 – 即显然不是实现安全的,但应该对每个人都可见.
子类的.m文件中的类别
这是一个坏主意,不要这样做.你只看到子类中的方法,但是你失去了实现的安全性而且它确实感觉不对.我只使用它进行单元测试,最终我将它们迁移到一个单独的标题中.
单独标题中的类别(MyClass_protected.h)
首选解决方案和最接近的Objective-C可以获得受保护的方法.它只是一个文件,严重的是,不要把你的内裤放在一堆.您可以使用类扩展(它们是匿名类别),您不会失去实现安全性.它只对包含它的类可见,它应该只是子类;除了最不称职的程序员之外,由于标题名称,所包含的方法旨在用作受保护的这一事实应该是显而易见的.