2

最新の iOS SDK のコア データを含むナビゲーション ビュー テンプレートの例に従っています。

ファイルのrootViewController.m@synthesize 行に次のように表示されます。

@synthesize fetchedResultsController=fetchedResultsController_, managedObjectContext=managedObjectContext_;

ヘッダー ファイルの場所:

@private
NSFetchedResultsController *fetchedResultsController_;
NSManagedObjectContext *managedObjectContext_;

}

@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;

これは、両方が @syntheized (ゲッターとセッターの作成) であるが、一方が他方と等しくなるように設定されていることを意味しますか? また、ファイルfetchedResultsController内のメソッドでもあるようです。rootViewController.m

この SDK バージョンでは、このテンプレートが変更されました。私は Apress の書籍「More iPhone 3 development」に従っていますが、これは非常に混乱した問題です。

4

2 に答える 2

3

構文では@synthesize、 の左側= (代入演算子ではなく、合成でこの構文に使用される単なる文字)はプロパティ(および関連するメソッド)の名前であり、 の右側=はインスタンス変数です。名前付きプロパティに使用します。

上記の例で@synthesize fetchedResultsController=fetchedResultsController_は、fetchedResultsController getter メソッドとsetFetchedResultsController: setter メソッドを作成します。どちらもストレージにfetchedResultsController_インスタンス変数を使用します。 

同様に、managedObjectContextおよびsetManagedObjectContext:アクセサー メソッドを作成します。どちらも managedObjectContext_ インスタンス変数によってサポートさ@synthesize managedObjectContext=managedObjectContext_ます

「右辺」が明示的に指定されていない場合 (宣言が read の場合@synthesize fetchedResultsController, managedObjectContext;)、synthesize はインスタンス変数にプロパティと同じ名前を想定していたでしょう。一部の Objective-C プログラマーは、ローカル関数スコープ変数を設定するつもりで代わりにインスタンス変数を設定するという間違いを犯しやすいため、このデフォルトの動作のままにしておくことを好みません。すべてのインスタンス変数にアンダースコアを使用すると、その意図がより明確になります。

明確にするために、複数の@synthesizeプロパティをカンマ区切りで 1 つに結合できます。それぞれが独自の宣言であるため、上記は次と完全に同等です。

@synthesize fetchedResultsController=fetchedResultsController_;
@synthesize managedObjectContext=managedObjectContext_;

また、新しい Xcode/iOS バージョンでは、明示的に定義されていない場合はインスタンス変数が自動的に作成され、指定されていない場合は @synthesize 宣言も想定されます。これらの違いについては、Apple の Quick-Ref Objective-C Feature Availability Indexで説明されています。

于 2013-03-11T00:40:58.070 に答える
-1

最初のもの (synthesize ステートメントの左側) のみがゲッターとセッターで合成され、「パブリック」インスタンス変数になります。

後者 (アンダースコア付き) はインスタンス内で引き続き使用できますが、インスタンスの外部には公開されません。どちらも同じメモリ アドレスを参照します。

于 2010-07-18T21:01:32.670 に答える