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