2

素朴な質問ですみません。
の内部にあるh fileが、クラススコープの外部@interfaceにあるプロパティの定義を見た場合、それはどういう意味ですか?

@property (nonatomic, readonly) RMMapContents *mapContents;

コードは次のとおりです。

@class RootViewController;
@class RMMapContents;

@interface MapTestbedAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;

    //MAIN VIEW
    //==============

    RootViewController *rootViewController;


    // NETWORK DATA
    // =============

    NSMutableArray  *photoTitles;         // Titles of images
    NSMutableArray  *photoSmallImageData; // Image data (thumbnail)
    NSMutableArray  *photoURLsLargeImage; // URL to larger image
    NSMutableData *receivedData;
    NSURLConnection *theConnection;
    NSURLRequest *request;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet RootViewController *rootViewController;
@property (nonatomic, readonly) RMMapContents *mapContents;


@end

関数内に次の行が表示されます。

- (void)foo:(xyz *)abc{
  ..
  RMMapContents *mapContents = [self mapContents];
  ..
}

それで、C++ から取得するとmapContents、グローバル スコープの var ではないように見えますが (結局のところ、それがプロパティと呼ばれる理由ですよね?)、関数内で同じ名前を再度定義するのは少しおかしくありませんか?

誰かがここで少し明確にできることを願っています。
ありがとう!

4

4 に答える 4

2

@interface ブロックのスコープは @end キーワードまで拡張され、中かっこ {} に制限されません。

したがって、@property 宣言は @interface のスコープ内にあり、正しく答えられた cli_hlt のように、mapContents プロパティの setter および getter メソッドの代わりのように機能します。

したがって、mapContents という名前のプロパティには、次のようなセッターとゲッターがあります。

- (void)setMapContents; //setter

- (RMMapContents *)mapContents; //getter

これらのメソッドを使用して、クラス内からアクセスできます。

[self setMapContents:newContents];

RMMapContents *contents = [self mapContents];
于 2012-06-12T10:19:00.140 に答える
1

さて、プロパティは単なる変数ではありません。プロパティは、変数とそのセッター メソッドおよびゲッター メソッドです。プロパティは通常、変数によってサポートされていると言われます。通常、変数はプロパティ自体と同じ名前を持っています (常にではありません)。

したがって、基本的に 3 つのシナリオがあります。

  1. 開発者がバッキング変数を再定義しました。次のようなものを探してください: @synthesize mapContents=mapContents_、実装の最初に -> ここでは問題ありません。

  2. コンパイラーは、変数を、現在ではなく、等しくないものとして定義しました mapContents->問題ありません。

  3. プロパティ バッキング変数は実際には " mapContents" と呼ばれるため、ローカル定義はグローバル定義を隠します (ここでコンパイラの警告を探します)。ただし、呼び出しによって[self mapContents]グローバル変数にアクセスするのではなく、ゲッターを呼び出します。ゲッターはクラス変数にアクセスします (ローカルmapContentsはスコープ外であるため)。

お役に立てれば。

于 2012-06-12T08:45:36.480 に答える
0

mapContentsクラスに初期化を返す名前のメソッドをクラスで探しますRMMapContents

基本的に、この行 は、メソッドを使用して呼び出されRMMapContents *mapContents = [self mapContents];たインスタンスを初期化することを示しています。RMMapContentsmapContensmapContents

于 2012-06-12T12:31:23.987 に答える
0

グローバル var mapContents は読み取り専用です。foo 関数で新しいポインタを作成すると、内部 var の値を変更できます。

于 2012-06-12T08:45:07.090 に答える