4

ViewControllerにプロパティを追加した場合

@property (strong, atomic) UIView *smallBox;

そしてそれをファイルで合成すると.m、変数は実際にsmallBoxは任意のインスタンスメソッド内で参照できます。

ただし、UIViewControllerのプロパティとしても定義されている場合でも、self.viewで置き換えることはできません。なぜ違いがあり、ルールは何ですか?viewview

4

3 に答える 3

10

self.viewview/_viewは同じものではありません。インスタンス変数の作成方法に応じて、viewまたは_view実際のオブジェクトインスタンス変数を参照します。これに直接アクセスするのは危険でありinitdeallocまたはアクセサでのみアクセスする必要があります。それ以外の場合は、を使用する必要がありますself.view

self.view[self view]は、メッセージ「view」をオブジェクト「self」に渡し、結果を返すとまったく同じです。デフォルトでは、オブジェクトはメッセージを受信すると、その名前でメソッドを実行し、のデフォルトの実装はview、関連するインスタンス変数の値(viewまたは_view)を返します。

Xcodeの古いバージョンでは、@synthesize viewと呼ばれるインスタンス変数を作成しますview。Xcodeの最新バージョンでは、プロパティを宣言すると、。がなくても、多くの場合にview呼び出されるインスタンス変数が自動的に作成されます。この変更により、ivarに直接アクセスしているときに気づきやすくなります。_view@synthesize

要するに:

  • initdeallocおよびviewアクセサー(カスタムで作成する場合)を除いて、常に。を使用しますself.view
  • これらのメソッドでは、それをとして参照する必要があります_view
  • 最新のXcode用に作成している場合は、まったく含めないでください@synthesize。少し古いXcode用に作成している場合は、@synthesize view=_view;
  • self.view「インスタンス変数の値」を意味するものではありません。これは、「メッセージ'view'を渡した結果」を意味し、通常、インスタンス変数を返すものとして実装されます。
于 2012-09-01T00:44:31.257 に答える
1

で可視性viewとして宣言されているため、メンバーに直接アクセスすることはできません。これにより、コードがそれにアクセスできなくなります。(通常、スーパークラスのインスタンス変数に直接アクセスすることは望ましくありません。)@packageUIViewController

クラス自体のプロパティについては、インスタンス変数に直接アクセスできますが、これがメモリ管理に与える影響に注意する必要があります。(同様に、Robが指摘しているように、アクセサーを回避することで回避している他の動作も同様です。)

于 2012-09-01T00:59:40.077 に答える
0

Appleが定義したプロパティには通常、名前の前にアンダースコアが含まれているため、を使用するself.viewと、実際に_viewはオブジェクトからインスタンス変数を取得します。コンパイル時にリンカーエラーが発生するため、コードで使用することはできません_viewが、Xcodeはそれを強調表示します。のインスタンス変数にアクセスする別の方法は、self.viewによるものself->_viewですが、これもリンカーエラーを引き起こします。これらのリンカエラーの理由は、コンパイルされたライブラリに_view;のシンボルが含まれていないためです。その宣言がにある場合でもUIViewController.h

于 2012-09-01T00:31:31.203 に答える