2

最近、LLVM2.0 でクラス拡張に ivar を追加できることを知りました。(gcc はこれを行うことができません) これは、ヘッダー ファイルにないため、他のユーザーが存在しないため、どういうわけか本当にプライベートな iVar です。お気に入り:

//SomeClass.h
@interface SomeClass : NSObject {

}
@end

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

@implementation SomeClass

@end

しかし、これはコンパイラに依存しています。ヘッダー ファイルにない ivar を宣言する他の方法はありますか?

4

3 に答える 3

1

インスタンス変数を宣言する唯一の場所は、インターフェイスまたはクラス拡張 (実際にはインターフェイスの拡張) です。ただし、関連付けられたオブジェクト関数を使用して、最新のランタイムでいつでもインスタンス変数を効果的に追加できます。

于 2011-04-12T19:30:13.003 に答える
0

ライブラリを実装していて、インスタンス変数を非表示にしたい場合は、Apple が UIWebView のインターフェイスで行っていることを確認してください。ヘッダー ファイルを公開しない内部 Web ビューがあります。

@class UIWebViewInternal;
@protocol UIWebViewDelegate;

UIKIT_CLASS_AVAILABLE(2_0) @interface UIWebView : UIView <NSCoding, UIScrollViewDelegate> { 
 @private
    UIWebViewInternal *_internal;
}
于 2011-04-12T17:39:39.613 に答える
0

ivar を内部で使用するだけで、最新のランタイム (Snow Leopard 64 ビットおよび iOS 3.0+ だと思います) を使用している場合は、クラス拡張でプロパティを宣言し、クラス内でそれらを合成するだけです。 . ヘッダーに ivar が公開されたり、乱雑なid _internalオブジェクトが表示されたりすることはなく、壊れやすい ivar も回避できます。

// 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+ の両方で機能することは確かです)。

于 2011-04-12T19:12:58.950 に答える