0

私はJoeConwayによるBigNerdRanch iOSプログラミングをフォローしていますが、次のコードを見ると少し戸惑います。

WebViewController.h

#import <Foundation/Foundation.h>
@interface WebViewController : UIViewController
@property (nonatomic, readonly) UIWebView *webView;
@end

WebViewController.m

#import "WebViewController.h"

@implementation WebViewController
- (void)loadView 
{
    // Create an instance of UIWebView as large as the screen
    // Tell web view to scale web content to fit within bounds of webview 
}

- (UIWebView *)webView
{
    return (UIWebView *)[self view];
}
@end

.hファイルで宣言されたプロパティを合成するべきではありませんか?Xcodeも警告を出しませんでした(通常、合成でプロパティを宣言するときに警告が出されます)。

ちなみに、本の中で彼はまた言及しました

WebViewController.hで、プロパティを追加します(ただし、インスタンス変数は追加しません)

プロパティを宣言すると、インスタンス変数が自動的に生成されませんか?私が逃したものを教えてください。ありがとう。

4

2 に答える 2

5

これは良い質問であり、その答えは少し微妙で、Objective-Cを始めた人にはすぐにはわからないことが多いと思います。まず、プロパティに関する神話を払拭しましょう。神話はこれです:

Objective-Cのプロパティはインスタンス変数に関連しています

これは必ずしも真実ではありません。それはしばしば真実ですが、すべての場合に真実であるとは限りません。真実は次のとおりです。

Objective-Cプロパティは、ゲッターメソッドとセッターメソッドを宣言します

(または、readonlyプロパティの場合は、ゲッターだけです)。特に、というプロパティを宣言する場合foo(説明のために、読み取り専用ではないと仮定します)、実際に行っているのは、作成しているクラスにというメソッドとというメソッドがあることをコンパイラに通知することだけ-fooです-setFoo:。.mファイルに宣言を追加することにより、@synthesize foo;これらのメソッド自体を生成するようにコンパイラーに指示します。ここでは、「コンパイラ、インスタンス変数(とも呼ばれます)を作成し、このインスタンス変数にアクセスするmyメソッドとメソッドfooの実装を生成します。特に、この変数の値をに返し、変数の値をに設定します。-foosetFoo:-foo-setFoo:

コンパイラにメソッドを合成させる必要はないことに注意してください。むしろ、あなたは自分自身-fooで書くことができ-setFoo:ます。さらに、これらのメソッドの実装をサポートするためにインスタンス変数を作成する必要はありません。好きなように書くことができます。

要約する@propertyと、getterメソッドとsetterメソッドの存在についてコンパイラーに通知するだけです。次に、次のいずれかを実行でき@synthesizeます。.m内のメソッド、または自分でメソッドを記述します。

于 2012-06-12T04:15:28.430 に答える
3

これは、 " webView" getterメソッドが.mファイルに実装されているため、" @synthesize"は必要ないためです。

" webView"メソッドがコードで明示的に作成されていない場合、コンパイラはプロパティが合成されていないことについて文句を言います。この場合、「読み取り専用」プロパティを合成すると、そこにあるコードで見られるのとほぼ同じことを実行する「getter」メソッドのみが作成されます。

そして、はい、宣言されたプロパティに関するAppleのドキュメントに@synthesizeよると、「 」について次のように述べています。

@synthesizeディレクティブを使用して、プロパティのセッターメソッドやゲッターメソッドを@implementationブロック内に指定しない場合は、それらを合成する必要があることをコンパイラーに通知します。@synthesizeディレクティブは、他に宣言されていない場合は、適切なインスタンス変数も合成します。

于 2012-06-12T04:07:32.777 に答える