web-dev-qa-db-ja.com

iOSの@ property / @ synthesizeに関する説明が必要

完全な初心者ではありませんが、私はiOSプログラミングとOjbective-Cを初めて使用します。私は主にC(DSP、マイクロコントローラー)、Delphi XE2/Pascal、Visual Basic、およびJava(デスクトップおよびAndroidアプリ)のバックグラウンドから来ています。

主にApressの「Beginning iOS 5 Development」という本でCocoaを学びました。

最近、私はWWDC 2012のビデオを見て、そのサンプルコードのいくつかを調べました。アプリを書く適切な方法、より具体的には@ property/@ synthesizeの言葉で混乱していると言わざるを得ません。

本では、サンプルコードのほとんど(すべてではない)を使用して、たとえばプロパティを定義します。

ViewController.h
@property (strong, nonatomic) NSMutableArray *list;

ViewController.m
@synthesize list;

次に、すべてのコードアクセスがリストを合成します

self.list

または単に

list

今、私が読​​んだすべてのWWDCコードサンプルでは、​​プログラマがプロパティを定義していることがわかりますが、.mファイルでは次のようなことをします

@synthesize list = _list;

そして時々アクセス

self.list

または

_list

私は混乱しています。正しい習慣は何ですか? As Appleプログラマーはすべてアンダースコアを使用します。私はそのようにするべきだと思いますが、なぜ本はそうしなかったのでしょうか?listと_listに違いはありますか?いつかself.listを使用し、時々list/_listを使用する理由。

@synthesizeを使用しないこともありますが、自分のアクセサーとミューテーターを書き直したいときだと思います(今まで私のケースではありません)。

私はWebをあちこち読んでいますが、心を正すほど明確なものは何もなかったので、StackOverflowを頼りにここに光を当てます。

最後になりましたが、私は現在のiOS 6のベストプラクティス/プログラミング手法に基づいて好みと回答をしています。古いiOSで正しく実行する方法を教えても無駄です。

31
HpTerm

正しい方法はありません。好みのスタイルのみがあります。

最新のコンパイラは、プロパティ宣言で暗黙的な合成を行います。

@synthesize list = _list;

コードには何も書かれていません。それはただ起こります。

ただし、明示的にこれを行うことを止めるわけではありません。

@synthesize list = somethingelse;

したがって、アクセサ(self.list)を介してlistへのポインタを要求すると、somethingelseへのポインタが取得されます。

ほとんどの場合、NSMutableArray *thing = self.listNSMutableArray *thing = somethingelseと同等です

そして、Appleがスタイルを使用しているからといって、それをしなければならないというわけではありません。各企業は通常、独自のコーディングスタイルを持っています。

@synthesize list;の使用に関する主な問題は、次のいずれかを記述できるリスクがあることです。

self.list = thingまたはlist = thing

前者はsythesised setList:アクセサーを使用しますが、後者は使用しないため、関連するバグのリスクをコードに入れますが、ARCプロパティーではリークが発生しないので、strongほど悪くはありません。

どのスタイルを使用する場合でも、一貫性を保ち、ivarを直接使用した場合の効果に注意してくださいlist = thingアクセサーself.list = thing

31
Warren Burton

これは、過去数年間で使用が急速に進化した言語機能であり、さまざまな形式を説明しています。最新のツールを使用すると、@synthesizeを無視して合理的に機能させることができます。

その場合のデフォルトの動作は、@synthesize list = _list;と同じ効果をもたらします。

8
Phillip Mills