web-dev-qa-db-ja.com

インターフェイスで変数を宣言するか、Objective-Cアークでプロパティを使用する必要がありますか?

アプローチ1:

@interface MyController : UIViewController {
    UILabel *myText;
}

@property (nonatomic, strong) UILabel *myText;

アプローチ2:

@interface MyController : UIViewController
@property (nonatomic, strong) UILabel *myText;

アプローチ3:

@interface MyController : UIViewController {
    UILabel *myText;
}

私はこの種のことについて話しているいくつかの記事を読みましたが、私はまだ私が採用しなければならないアプローチを本当に理解していません。

また、アプローチ1は古い方法だと誰かが言ったので、ARCを使用したios sdk6のベストプラクティスを知りたいと思います。

プロパティを使用して変数を宣言することは、ゲッターとセッターを生成する簡単な方法であり、誰かがそれを使用することを提案したことを私は知っています。しかし、変数が別のクラスから呼び出すためのものではない場合に質問したいのですが、プロパティを使用する変数には必要ですか?インターフェイス内でプライベート変数として設定しますか?それとも、インターフェイス内でのみ宣言する変数の方が良いですか?ベストプラクティスを学びたいので、これがばかげた質問であるならば、私を許してください。

さらに、一部の開発者はこのように@synthesizeを記述します

@synthesize myText=_myText;

しかし、これを書く人もいます:

@synthesize myText;

また、違いとどちらが好ましいか知りたいですか?

どうもありがとうございました!

33
fmchan

最も現代的な方法1

  • 可能な限り、プロパティを宣言します
  • iVarを個別に宣言しないでください 2
  • @synthesizeしないでください 3
  • .hファイルでできるだけ少ないプロパティを見つけます 4
  • .mファイルのクラス拡張子でできるだけ多くのプロパティを見つけます 5

1 Xcode4.5.2以降。これのほとんどは4.4に適用され、一部は4.2(Snow Leopardで利用可能な最後のバージョン)ではコンパイルされません。これはプリプロセッサのものなので、少なくともiOS5とはすべて互換性があります(私はiOS4でテストしていませんが、それでも問題ないはずです)。

2 iVar およびプロパティを宣言しても意味がありません。プロパティのiVars 代わりにを宣言したいというあいまいなケースがいくつかあると確信していますが、私は何も考えられません。

3 Xcodeは、プロパティと同じ名前で、前に_underscoreが付いたiVarを作成します。 (まれに)他の種類の動作が必要な場合は、手動で_@synthesize property = someOtherName_できます。 @vikingosegundoは私たちを 動的ivarに関するこの記事 にリンクします。これは_@synthesize_のユースケースです。 @RobNapierは、プロパティに対して独自のゲッター(読み取り専用)とセッター(読み取り/書き込み)を作成する場合は、do _@synthesize iVar = _iVar_(奇妙なことに)する必要があるとコメントしています。この場合はプリプロセッサーです。 iVarは生成されません。

4 インターフェースの一般的なルール:可能な限り空にしてください。個人使用の場合は、実際にmethodsを宣言する必要はありません。インターフェイス宣言なしでコードを機能させることができる場合は、それが方法です。

5 これは、.mファイル内の@interfaceブロックであり、@ implementationの上に配置されます。

_#TestClass.m

@interface TestClass()

//private property declarations here

@end

@implementation TestClass
...
_
58
foundry

明確さと整理のために参照およびコメントできる@synthesizedプロパティの素敵な目次が必要な場合は、@ synthesizeを使用することもできます。

また、@ synthesizeを使用すると、プロパティにブレークポイントを設定し、その値が変更されたときにトラップすることができます。

コンパイラーがすべてを実行すると、実際に起こっていることから距離を置き、無知になってしまいます。ただし、常に自分ですべてを入力する必要がないのも良いことです。

1
Alex Zavatone