36

SOについても同様の質問がありますが、ここでは十分に説明されていないことを明確にしておきたいと思います。

私は、すべてのデリゲートとアウトレット(実際には、「親」オブジェクトへの参照、良き市民であり、オブジェクトグラフについて少し考えてみる)は、弱参照をゼロにする必要があることを理解しています。参照されるオブジェクトの保持カウントがゼロに達すると、弱いポインターが自動的にnilにドロップするという性質により、これはIBOutletsをnilに設定するviewDidUnload必要がなくなったことを意味しますか?

だから、私が私のアウトレットをそのように宣言した場合:

@property (nonatomic, weak) IBOutlet UILabel *myLabel;

次のコードは効果がありますか?

- (void)viewDidUnload
{
    self.myLabel = nil;

    [super viewDidUnload];
}
4

5 に答える 5

15

ちょっと調べてみて…

私が理解しているように、weakは、両方とも弱参照であるという点で、assignに似ています。

ただし、assignはゼロ調整参照を作成しません。つまり、問題のオブジェクトが破棄され、そのプロパティにアクセスすると、が取得されますBAD_ACCESS_EXCEPTION

参照しているオブジェクトが破棄されると、弱いプロパティは自動的にゼロになります(= nil)。

どちらの場合も、プロパティをnilに設定する必要はありません。これは、問題のオブジェクトの保持カウントに寄与しないためです。保持プロパティを使用する場合に必要です。

どうやら、ARCは「保持」と同じ新しい「強力な」プロパティも導入していますか?

ここで行われた調査

于 2011-10-07T03:32:39.343 に答える
11

少しテストしましたが、viewDidUnloadメソッドのコード不要のようです。これをサポートするために、viewDidUnloaddoのドキュメントは実際に次のように述べています。

このメソッドが呼び出されるまでに、viewプロパティはnilになります。

弱参照がnil自動的にに設定されている必要があることを示します。

于 2011-10-07T03:45:46.013 に答える
5

IBOutletsが実際に自動的にnilに設定されていることを裏付ける経験的証拠がいくつかあります。これが私がしたことです:

  1. @synthesize myLabel = myLabel_後でデバッガーでそれらの値を検査できるように、IBOutletプロパティ()に明示的なivarを設定しました。
  2. の最初の行でブレークポイントを有効にしましたviewDidUnload
  3. viewDidUnload私はメモリ警告をシミュレートすることによって呼び出されるように手配しました。
  4. IBOutletプロパティに関連付けた明示的なivarの値を調べました。

明示的なivarはすべてnil値として持っていたので、ブレークポイントに到達しました。

于 2012-02-27T19:36:23.343 に答える
3

弱参照を使用している場合にARCでアウトレットがどのように管理されるかについての私の理解から、viewDidUnloadはすでにゼロになっているため、何も追加する必要はありません。したがって、そうすることは冗長です。

ただし、強力なアウトレットがある場合(これは、ペン先のトップレベルのアイテムを指している場合に行う必要があるとアップルが言っています)、これらのアイテムをゼロにするために、viewDidUnloadに適切な行を追加し続ける必要があります。

于 2012-02-24T23:55:23.020 に答える
0

iOS5およびOSX10.7以降でweakは、自動ゼロ調整ポインターが生成されます。これは、ポイントされたオブジェクトが解放されると、ポインタが自動的にに設定されることを意味しますnil(詳細については、ARCの弱参照のゼロ化を参照してください)。

そのため、iOS5以降およびOSX 10.7以降では、メソッドでweak IBOutletプロパティをnil手動で設定することは役に立ちませんviewDidUnload。メインビューがアンロードされると、すべてのサブビューが解放されるため、関連するプロパティはに設定されnilます。

于 2013-03-15T13:03:36.263 に答える