目标C中的私人课程

时间:2011-10-07 03:08:08

标签: objective-c oop

我想在Objective C中使用嵌套私有类的模式。

要求是:

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

考虑到这些评论,我正在简化要求:

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

还不可能吗?

2 个答案:

答案 0 :(得分:86)

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

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

通过“它”,我的意思是几乎任何可以宣布的东西;班级,全球等...

即。如果你在@interface/@implementation文件中为一个类粘贴.m对,那么该类实际上是该编译单元的私有。当然,如果没有名称空间,请确保该类具有唯一名称。


考虑一下:

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有“实例变量”,而不是“成员变量”。它们是相似的,但你最好使用该语言的词汇表。)

答案 1 :(得分:1)

你可以拥有“半隐藏”的私人方法。您可以包含一个接口文件,该接口文件提供实现文件中的扩展方法,然后只实现在那里声明的方法。我之前对此感到好奇,并提出了类似的问题。

Proper Objective-C Helper "Wannabe" Private methods?