31

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

私は主に、Apressの「BeginningiOS5Development」という本で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

私は混乱しています。正しい習慣は何ですか?Appleプログラマーは皆アンダースコアを使用しているので、私はそれをそのようにすべきだと思いますが、なぜ本はそうしなかったのですか?listと_listに違いはありますか?さらに、私は同じオブジェクトにいるので、なぜ時々self.listを使用し、時にはlist/_listを使用するのですか。

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

私はウェブ上であちこち読んだことがありますが、私の心を正しく設定するのに十分明確なものは何もなかったので、ここに光をもたらすためにStackOverflowを頼りにしています。

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

4

2 に答える 2

31

正しい方法はありません。あなたの好きなスタイルだけがあります。

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

@synthesize list = _list;.

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

ただし、これを明示的に行うことはできません。

@synthesize list = somethingelse;

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

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

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

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

self.list = thingまたはlist = thing

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

list = thingどのようなスタイルを使用する場合でも、一貫性を保ち、アクセサーを使用する場合と比較してivar を直接使用する場合の影響に注意してください。self.list = thing

于 2012-10-29T12:00:02.793 に答える
8

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

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

于 2012-10-29T11:46:10.860 に答える