【问题标题】:Private classes in Objective CObjective C 中的私有类
【发布时间】:2011-12-02 17:14:00
【问题描述】:

我想要一个用于 Objective C 中嵌套私有类的模式。

要求是:

  • 类对其他类不可见/不可访问。
  • 类可以执行方法(即,不是 C 结构)
  • 包含类成员对嵌套类可见/可访问

考虑到cmets,我正在简化要求:

  • 内部类可以被其他类访问,但不可见(类似于使用类别隐藏私有方法)。
  • 内部类不必嵌套

还是不行吗?

【问题讨论】:

  • 抱歉,Obj-C 中不存在您要的内容。
  • @Kevin Ballard:它存在于 Obj-C++ 中
  • @Dani:Ovesh 专门询问了 Objective-C 中的类。谈论 C++ 中的类具有误导性,因为它们是完全独立的事物。仅仅因为它们使用相同的名称(“类”)并不意味着它们完全相关。
  • Obj-C++ 的存在是为了让 Obj-C 调用 C++ 代码。不要指望它对其他任何东西都有好处,比如原创作品。
  • @Oversh:在你的.m 文件而不是.h 文件中有方法。

标签: objective-c oop


【解决方案1】:

Objective-C 没有正式声明方式的私有类或私有实例变量的概念。

相反,Objective-C 中的可见性完全由您声明某事的位置控制。如果它在头文件中,它可以由其他东西导入。如果它在实现文件中声明,则不能(合理地)导入,因此实际上是该编译单元私有的。

“它”是指几乎所有可以声明的东西;类、全局等...

即如果您在.m 文件中为类添加@interface/@implementation 对,则该类实际上是该编译单元的私有。当然,如果没有命名空间,请确保该类是唯一命名的。


考虑一下:

Foo.h:

@interface Foo: NSObject
... public interface
@end

Foo.m:

@interface __FooSupportClass: NSObject
... interface here ...
@end

@implementation __FooSupportClass
@end

@interface Foo()
@property(retain) __FooSupportClass *__fooSupport;
@end

@implementation Foo
@synthesize __fooSupport = fooSupport__;
... etc ...
@end

这为您提供了一个仅在您的实现中可用的私有可见性支持类,该类具有实例变量和类上的 setter/getter 方法,这些方法在编译单元之外也不可见。

(请注意,Objective-C 有“实例变量”,而不是“成员变量”。它们很相似,但最好使用语言的词汇表。)

【讨论】:

  • 这是我最初的方法。但是,我需要该内部类的一个实例才能成为成员。我怎样才能做到这一点?前向@class 声明能解决问题吗?
  • 好的,我刚刚检查过了。好的,这就是我要采用的方法。当然,内部类无法访问包含类成员的问题仍然存在。
  • 如何从 fooSupport 访问 foo 的变量?有可能吗?
  • @Sakthimuthiah 和 Ovesh:给 FooSupport 一个指向 Foo 实例的弱(以打破保留循环)指针。在声明 FooSupport 之前声明 Foo 的私有属性(请记住,两者都在 Foo.m 中),以便 FooSupport 能够访问它们。
【解决方案2】:

你可以有“半隐藏”的私有方法。您可以在实现文件中包含一个提供扩展方法的接口文件,然后只实现其中声明的方法。我之前对此很好奇,也问过类似的问题。

Proper Objective-C Helper "Wannabe" Private methods?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    • 2011-08-04
    • 2012-05-06
    • 2012-01-05
    • 1970-01-01
    • 2015-03-11
    • 2018-03-14
    相关资源
    最近更新 更多