ViewControllerにプロパティを追加した場合
@property (strong, atomic) UIView *smallBox;
そしてそれをファイルで合成すると.m
、変数は実際にsmallBox
は任意のインスタンスメソッド内で参照できます。
ただし、UIViewControllerのプロパティとしても定義されている場合でも、self.view
で置き換えることはできません。なぜ違いがあり、ルールは何ですか?view
view
ViewControllerにプロパティを追加した場合
@property (strong, atomic) UIView *smallBox;
そしてそれをファイルで合成すると.m
、変数は実際にsmallBox
は任意のインスタンスメソッド内で参照できます。
ただし、UIViewControllerのプロパティとしても定義されている場合でも、self.view
で置き換えることはできません。なぜ違いがあり、ルールは何ですか?view
view
self.view
とview
/_view
は同じものではありません。インスタンス変数の作成方法に応じて、view
または_view
実際のオブジェクトインスタンス変数を参照します。これに直接アクセスするのは危険でありinit
、dealloc
またはアクセサでのみアクセスする必要があります。それ以外の場合は、を使用する必要がありますself.view
。
self.view
[self view]
は、メッセージ「view」をオブジェクト「self」に渡し、結果を返すとまったく同じです。デフォルトでは、オブジェクトはメッセージを受信すると、その名前でメソッドを実行し、のデフォルトの実装はview
、関連するインスタンス変数の値(view
または_view
)を返します。
Xcodeの古いバージョンでは、@synthesize view
と呼ばれるインスタンス変数を作成しますview
。Xcodeの最新バージョンでは、プロパティを宣言すると、。がなくても、多くの場合にview
呼び出されるインスタンス変数が自動的に作成されます。この変更により、ivarに直接アクセスしているときに気づきやすくなります。_view
@synthesize
要するに:
init
、dealloc
およびview
アクセサー(カスタムで作成する場合)を除いて、常に。を使用しますself.view
。_view
。@synthesize
。少し古いXcode用に作成している場合は、@synthesize view=_view;
self.view
「インスタンス変数の値」を意味するものではありません。これは、「メッセージ'view'を渡した結果」を意味し、通常、インスタンス変数を返すものとして実装されます。で可視性view
として宣言されているため、メンバーに直接アクセスすることはできません。これにより、コードがそれにアクセスできなくなります。(通常、スーパークラスのインスタンス変数に直接アクセスすることは望ましくありません。)@package
UIViewController
クラス自体のプロパティについては、インスタンス変数に直接アクセスできますが、これがメモリ管理に与える影響に注意する必要があります。(同様に、Robが指摘しているように、アクセサーを回避することで回避している他の動作も同様です。)
Appleが定義したプロパティには通常、名前の前にアンダースコアが含まれているため、を使用するself.view
と、実際に_view
はオブジェクトからインスタンス変数を取得します。コンパイル時にリンカーエラーが発生するため、コードで使用することはできません_view
が、Xcodeはそれを強調表示します。のインスタンス変数にアクセスする別の方法は、self.view
によるものself->_view
ですが、これもリンカーエラーを引き起こします。これらのリンカエラーの理由は、コンパイルされたライブラリに_view
;のシンボルが含まれていないためです。その宣言がにある場合でもUIViewController.h
。