1

Objective-C は初めてで、基本的には C++ のバックグラウンドを持っています。私は今、objective-c を学んでおり、私が理解したことが書いているか間違っているかを確認したいと思います。親切なアドバイス。

私は次のクラスを持っています:

@interface Test: NSObject
{
 int instance1; 
}
@property int instance1;
 - (void)  sayHello;
@end

クラス 'Test' にはインスタンス変数 がありますinstance1。メンバー関数 ie: sayHello が変数にアクセスしたい場合は、getter/setter 関数を介して行う必要があります。したがって、それを取得するには2つの方法があります。

  1. ユーザーが定義できます。
  2. コンパイラからヘルプを得ることができますか?. どのように?。同じ変数をプロパティとして宣言し、それを合成すると、コンパイラはその特定の変数の getter/setter のコードを取得します。

したがって、残念なことに、getter/setter はメソッド実装で変数にアクセスする唯一の方法です。ゲッター/セッターが必要self.instance1 = 100;です。instance1 = 100

1. と 2. の両方を見逃しているため、instance1変数にアクセスする方法はありません。

また、instance1パブリック変数は、オブジェクト インスタンスを使用してクラスの外部にアクセスできます。

Test *t = [[ Test alloc] init];
t.instance1 = 200;

質問:

  1. instance1クラス外のインスタンス変数にアクセスできないように、「プライベート」にする方法はありますか?
  2. 私の理解に何か問題がありますか?
4

2 に答える 2

1

イオン SomeDelegate.h

@interface SomeDelegate : NSWindowController {
@private
    int fLanguage;
    int fDBID;

    bool fEndEditingIsReturn;
@public
    int fIsMyLastMSG;  
}

@property int language;

SomeDelegate.mm 内

@implementation SomeDelegate

@synthesize language=fLanguage;

私の例では、プライベート変数とパブリック変数を取得ますプライベート変数fLanguageは、合成アクセサメソッド用propertyがあります。

于 2012-09-28T14:45:36.720 に答える
1

メンバー関数 ie: sayHello が変数にアクセスしたい場合は、getter/setter 関数を介して行う必要があります。

そうではありませんhave to。アクセサー メソッドを使用せずに ivar に直接アクセスできます。

- (void)sayHello {
   instance1 = 123;
}

ヘッダーではなく実装ファイルで宣言することにより、プライベート ivar を定義できます。

@implementation Test {
   int privateVar;
}
// ... additional implementation, methods etc.
@end

Xcode 4.4 以降、ivar を宣言する必要がなくなったことに注意してください。プロパティを宣言するだけです。ivar とアクセサ メソッドは自動的に合成されます。

詳細については、この質問に対する私の回答を読むことをお勧めします: 変数の宣言

于 2012-09-28T14:21:19.730 に答える