如何声明在类实例外部不可见或不可用的实例变量和方法?

mar*_*n's 13 iphone xcode objective-c ios

我已经看了很多关于这个主题的帖子.也许我没有碰到"那个",有人会指出我朝这个方向发展.问题很简单,可能有一个简单的答案.

如果你有两个ivars,比如说,"public_ivar"和"private_ivar",你应该在哪里/如何声明它们,以便public是公共的,什么是private是不会以任何方式暴露给任何查看头文件的人?

在"public_method"和"private_method"的情况下也是同样的问题.

我喜欢干净的头文件(在其他语言中),只显示我希望别人看到的方法和ivars.您应该能够发布您的头文件,而不会遇到某人访问他们不应该访问的东西的危险.你如何在Objective-C中做到这一点.

例如,假设我决定需要使用ivar来跟踪所有需要访问此信息的各种类方法之间的某些数据,计数器或类似的东西.如果在@interface下的标题中传统地声明了这个ivar,那么它的存在是公开广告的,任何创建该类实例的人都可以使用它.理想的情况是,这个ivar在类实现之外根本不可见.

小智 17

您可以在类扩展中声明实例变量或声明的属性.由于类扩展是在实现文件中声明的(即,不是头文件),因此检查头文件的人不会看到它们.例如,在头文件中:

@interface SomeClass : NSObject
@end
Run Code Online (Sandbox Code Playgroud)

并在实现文件中:

@interface SomeClass ()
@property (nonatomic, assign) int privateInt;
@end

@implementation SomeClass

@synthesize privateInt;
…
@end
Run Code Online (Sandbox Code Playgroud)

要么

@interface SomeClass () {
    int privateInt;
}
@end

@implementation SomeClass
…
@end
Run Code Online (Sandbox Code Playgroud)

请注意,在运行时期间,没有任何东西阻止访问私有/类扩展实例变量(或类扩展中声明的属性的访问器方法).我写了一篇相当详细的帖子,作为Stack Overflow上另一个问题的答案:私有@property是否创建了一个@private实例变量?

编辑:类扩展中的实例变量在WWDC 2010会话144中呈现.

编辑: "使用Clang/LLVM 2.0编译器,您还可以在类扩展中声明属性和实例变量."

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocCategories.html#//apple_ref/doc/uid/TP30001163-CH20-SW1