14

@publicキーワードでパブリックインスタンス変数を定義できることは知っています。ただし、Objective-C構文では、他のクラスの変数にアクセスすることはできません。@public Ivarにどのような機能を期待する必要がありますか?または、他のクラスのIvarにアクセスするにはどうすればよいですか?

4

3 に答える 3

59

Objective-Cは、Cのスーパーセットとして、クラスの実装の外部からパブリックインスタンス変数にアクセスできるようにします。さて、あなたがそれが許可されていないと聞いたかもしれない理由は、それが非常に落胆しているからです。ほとんどの場合、実装コンテキストの外部でインスタンス変数にアクセスする場合は、アクセサーとミューテーター(プロパティ)を使用する必要があります。

Objective-Cクラスは、実際isaには、パブリックフィールドにアクセスできるフィールド(オブジェクトになる)を持つ単純な古いC構造体に要約されます。クラスのインスタンスを処理するときは、オブジェクト(特別な構造体)へのポインターを操作しているためです。したがって、を使用してパブリックフィールドにアクセスします->

次に例を示します。

@interface SomebodyIsntEncapsulating : NSBadIdea {
  @public
  NSString *badIdea;
  BOOL shouldntDoIt;

  @protected
  NSString *ahThatsBetterThankGod;

  @private
  NSString *sweetThanksNowEvenMySubclassesCantTouchMe;
}

さて、いくつかの完全に異なるコンテキストでは、次のことができます。

SomebodyIsntEncapsulating *whatOh = [[SomebodyIsntEncapsulating alloc]
                                       initWithDanger:kDangerLevelEpicBraceYourself];
whatOh->badIdea = [@"I'm a public field. Make sure to retain or copy me!" copy];
NSLog(@"Please! Write some accessors and mutators!: %@", whatOh->badIdea);

お役に立てば幸いです。

于 2010-02-02T07:35:51.160 に答える
6

通常はc構造体のメンバーにアクセスするのと同じように、->(ポインターごとのメンバー)演算子を使用してアクセスできます(obj-cには常にオブジェクトへのポインターがあることに注意してください)。

...
@public
int a;
...

myObject->a = 1;
于 2010-02-02T07:35:30.583 に答える
2

あなたはそれをするためにアクセサメソッドを書くことになっています。オブジェクト指向設計は、クラスが別のクラスのオブジェクトの内部構造を気にする必要がないことを意味します。

とは言うものの、idは単なるポインターなので、実行していることを理解していて、適切なアクセサーメソッドを作成する方法がない場合は、obj->ivarを実行できます。

于 2010-02-02T07:38:39.180 に答える