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编译器,您还可以在类扩展中声明属性和实例变量."
| 归档时间: |
|
| 查看次数: |
13882 次 |
| 最近记录: |