我最近了解到可以使用 LLVM2.0 在类扩展中添加 ivar。 (海湾合作委员会不能这样做) 这在某种程度上是真正私有的 iVar,因为其他用户不知道它的存在,因为它不在头文件中。 喜欢:
//SomeClass.h
@interface SomeClass : NSObject {
}
@end
//SomeClass.m
@interface SomeClass ()
{
NSString *reallyPrivateString;
}
@end
@implementation SomeClass
@end
但这确实依赖于编译器。还有其他方法可以声明头文件中没有的 ivar 吗?
@class UIWebViewInternal;
@protocol UIWebViewDelegate;
UIKIT_CLASS_AVAILABLE(2_0) @interface UIWebView : UIView <NSCoding, UIScrollViewDelegate> {
@private
UIWebViewInternal *_internal;
}
id _internal
对象,并且您也可以绕过脆弱的 ivars。
// public header
@interface MyClass : NSObject {
// no ivars
}
- (void)someMethod;
@end
// MyClass.m
@interface MyClass ()
@property (nonatomic, retain) NSString *privateString;
@end
@implementation MyClass
@synthesize privateString;
- (void)someMethod {
self.privateString = @"Hello";
NSLog(@"self.privateString = %@", self.privateString);
NSLog(@"privateString (direct variable access) = %@", privateString); // The compiler has synthesized not only the property methods, but also actually created this ivar for you. If you wanted to change the name of the ivar, do @synthesize privateString = m_privateString; or whatever your naming convention is
}
@end
除了 LLVM 之外,它还可以与 Apple 的 gcc 一起使用。 (我不确定这是否适用于其他平台,即不适用于 Apple 的 gcc,但它肯定适用于 iOS 和 Snow Leopard+)。