0

私は趣味として以外にiOSのプログラミングを実際に使用することがないため、数か月ごとにCocoaを再学習しようとしています。基本に立ち返り、ドット表記の違いを見ていきます。たとえば、デフォルトで一般的なタスクを実行するようにAPIがどのように更新されたかを確認します。

ドキュメントはたくさんありますが、これは良いことですが、すぐに立ち上げて実行したい場合には悪いことになることもあります。それがゆっくりと戻ってきている間、私は自分自身がこの主題に関して生まれ変わった新生児であると考えているので、どんな助けもありがたいです。


ヘッダーファイル:

@interface FooClass : NSObject
{
@private
    double foo;
}
@property (nonatomic) double foo;
@end

実装ファイル:

@implementation FooClass
@synthesize foo = _foo;
- (void) doSomething
{

}
@end

doSomething実装内で、get / setがいつ更新されるか(ローカルエイリアス)barのように、クラスへのポインタであるローカル変数(eg)を持つことは可能ですか?私は次のバリエーションを試しました:foobarfoo

double bar = *self.foo;
double *bar = self.foo;
double *bar = *self.foo;
double *bar = &self.foo;

bar=5;

もしそうなら、正しい構文は何ですか?また、これは悪い考えだと何かが私に言っているのに、なぜそうなるのでしょうか?


編集:もう少し検索した後、私は似たようなものを見つけたようです:Objective-c:プロパティへのダブルポインタは許可されていませんか?今、私はそれを理解しようとします。

4

1 に答える 1

2

あなたの例には間違いが含まれています:

@interface FooClass : NSObject
{
@private
    double foo;
}
@property (nonatomic) double foo;
@end

これはプロパティを宣言しますfoo。また、ivar(インスタンス変数)fooを宣言します。これは、同じ名前のプロパティに関連付けられたivarであると想定される場合があります。

@implementation FooClass
@synthesize foo = _foo;
@end

残念ながら、@synthesizeステートメントには「fooプロパティを合成し、それを呼び出すivarを作成する」と書かれ_fooています。これで、2つのivar foo(の間に作成{}した@interface_fooと、プロパティに関連付けられたivarとして合成したばかりのivarができましたfoofoo明示的に宣言されたivarがそこに浮かんでいるのは良くありません。読者は、同じ名前のプロパティに関連付けられていると思い込ませますが、そうで_fooはありません。

ずっと前に、明示的なivar宣言を修正するようにアドバイスされていたでしょう。

@interface FooClass : NSObject
{
@private
    double _foo;
}
@property (nonatomic) double foo;
@end

しかし、今ではさらに良いことに、プロパティの明示的なivar定義を完全に省略し@synthesize、ステートメントにそのivarを作成させて、上記で説明した問題の可能性を排除することをお勧めします。

@interface FooClass : NSObject
@property (nonatomic) double foo;
@end

さらに、@synthesizeステートメントはオプションになりました。省略した場合は、提案したとおりに実行され@synthesize foo = _foo;ます。

そして、あなたのプロパティにアクセスするための変数を持つことについてのあなたの質問に答えて、それは_fooインスタンス変数が何であるかです。なぜ別の変数が必要なのですか?また、通常はゲッターを使用する必要があります。

一般に、プロパティの設定にivarを使用するのではなく、プロパティのアクセサーを使用することをお勧めします。このカウンセルは、ローカル変数を介してプロパティの値を変更しようとするすべての試みにも適用されます。絶対にivarを使用する必要があるのは、初期化子とdeallocメソッドのみです。

ちなみに、「アクセサメソッドを使用してプロパティ値を設定する」への参照は、主な質問に対する回りくどい答えです(少なくとも、そのローカル変数を使用してプロパティの値を変更したい場合)。プロパティの値を変更するためにのみ、オブジェクトセッターアクセサーを使用する必要があります。セッターは、バイパスするのが賢明ではない重要なことを行います。あなたの最後の質問に答えることは、事実上、コンパイラの警告を生成しない方法で間違ったことをする方法をあなたに指示することになるでしょう、そしてそれで私はそこに行くことを躊躇します。

関連する参考資料は次のとおりです。

于 2012-12-18T01:53:09.330 に答える