有没有办法在 Objective-C 中添加不在头文件中的 iVar(不使用 LLVM 2.0 或更高版本)?
我最近了解到可以使用 LLVM2.0 在类扩展中添加 ivar。 (海湾合作委员会不能这样做) 这在某种程度上是真正私有的 iVar,因为其他用户不知道它的存在,因为它不在头文件中。 like:
//SomeClass.h
@interface SomeClass : NSObject {
}
@end
//SomeClass.m
@interface SomeClass ()
{
NSString *reallyPrivateString;
}
@end
@implementation SomeClass
@end
但这确实依赖于编译器。还有其他方法可以声明头文件中没有的 ivar 吗?
I recently learned that you can add ivar in a class extension with LLVM2.0. (gcc can't do this)
This is somehow really private iVar because other users don't it's existence since it's not in the header file.
like:
//SomeClass.h
@interface SomeClass : NSObject {
}
@end
//SomeClass.m
@interface SomeClass ()
{
NSString *reallyPrivateString;
}
@end
@implementation SomeClass
@end
But this does rely on the compiler. Is there any other way to declare an ivar that's not in the header file?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
声明实例变量的唯一位置是接口或类扩展(实际上是接口的扩展)。但是您可以使用 关联对象函数。
The only place to declare instance variables is in the interface or a class extension (which is really an extension of the interface). But you can effectively add instance variables at any time with the modern runtime using the associated object functions.
如果您正在实现一个库并想要隐藏实例变量,请查看 Apple 在 UIWebView 界面中所做的操作。它们有一个不公开头文件的内部 Web 视图。
If you are implementing a library and want to hide your instance variables take a look at what Apple does in the interface for UIWebView. They have an internal webview that does not expose a header file.
如果您只是要在内部使用 ivar,并且您使用的是现代运行时(我认为是 Snow Leopard 64 位和 iOS 3.0+),那么您可以在类扩展中声明属性并在类中合成它们。您的标头中没有暴露 ivars,没有混乱的 id _internal 对象,并且您也可以绕过脆弱的 ivars。
除了 LLVM 之外,它还可以与 Apple 的 gcc 一起使用。 (我不确定这是否适用于其他平台,即不适用于 Apple 的 gcc,但它肯定适用于 iOS 和 Snow Leopard+)。
If you're just going to be using the ivar internally, and you're using the modern runtime (Snow Leopard 64 bit and iOS 3.0+, I think) then you can just declare properties in a class extension and synthesize them inside the class. No ivars are exposed in your header, no messy
id _internal
objects, and you get around fragile ivars, too.This works with Apple's gcc, in addition to LLVM. (I'm not sure if this works on other platforms, ie not Apple's gcc, but it will certainly work for both iOS and Snow Leopard+).