有没有办法在 Objective-C 中添加头文件中没有的 iVar(不使用 LLVM 2.0 或更高版本)?

问题描述 投票:0回答:3

我最近了解到可以使用 LLVM2.0 在类扩展中添加 ivar。 (海湾合作委员会不能这样做) 这在某种程度上是真正私有的 iVar,因为其他用户不知道它的存在,因为它不在头文件中。 喜欢:

//SomeClass.h
@interface SomeClass : NSObject {

}
@end

//SomeClass.m
@interface SomeClass ()
{
    NSString *reallyPrivateString;
}
@end

@implementation SomeClass

@end

但这确实依赖于编译器。还有其他方法可以声明头文件中没有的 ivar 吗?

objective-c clang header-files ivar
3个回答
1
投票

声明实例变量的唯一位置是在接口或类扩展中(这实际上是接口的扩展)。但是,您可以使用现代运行时使用关联的对象函数随时有效地添加实例变量。


0
投票

@class UIWebViewInternal; @protocol UIWebViewDelegate; UIKIT_CLASS_AVAILABLE(2_0) @interface UIWebView : UIView <NSCoding, UIScrollViewDelegate> { @private UIWebViewInternal *_internal; }



0
投票
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+)。

© www.soinside.com 2019 - 2024. All rights reserved.