objective-c - 使用现代 Objective-C 的 protected 变量?

标签 objective-c

我觉得现代 Objective-C 鼓励使用实例变量作为内存管理和键值观察的属性。效果很好,我在实现文件中使用接口(interface)来获取私有(private)变量,如下所示:

@interface MyClass ()
@property NSObject* myVar;
@end

但是,我怎样才能创建 protected 变量呢?在上述情况下,我的子类将无法看到这样声明的属性。我可以走 iVar 路线,但是如果像上面那样声明私有(private)变量并且 protected 是 iVar,那么其余代码就会感觉不对劲。

我读过这个解决方案:Workaround to accomplish protected properties in Objective-C ,但它似乎使代码过于复杂。

最佳答案

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

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

主类界面

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

同一.h文件中的类别

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

类直接在子类的.m文件中

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

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

首选解决方案,最接近 Objective-C 可以访问 protected 方法。这只是一个文件,说真的,别把你的内裤弄成一堆。您可以使用类扩展(它们是匿名类别)并且不会失去实现安全性。它只对包含它的类可见,这些类应该只是子类;由于 header 名称,包含的方法旨在用作 protected 这一事实对于除了最无能的程序员之外的所有人来说应该是显而易见的。

关于objective-c - 使用现代 Objective-C 的 protected 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18028076/

相关文章:

ios - 使用 GPUImage 库的高斯模糊

ios - ARC 提示实例变量

objective-c - 总是使用 isEqual : in Objective-C for object comparison? 是一种好的形式吗

ios - 在 Storyboard 中,嵌入式 View Controller 不再与其容器 View 大小相同

objective-c - iPad 应用更新到 iOS4 SDK 后只显示黑屏

iphone - 如何在用户滚动 TextView 后启用按钮

ios - 将字符串作为标签或按钮中的其他值传递

ios - 如何将 Objective-C App Delegate 转换为 Swift?

ios - 在 iOS 中预览 Dropbox 文件

objective-c - 卡恩算法和可达性