9

だから私は iOS 4 をサポートするプロジェクトを持っていたので、すべての IBOutlets は__unsafe_unretained、ペン先にあるがコントローラーのメイン ビュー (同じペン先の別のビュー) の外側にある IBOutlets でさえあり、すべてうまく機能しました。

その時が来て、クライアントは iOS 5 のみをサポートすることを望んでいるため、チームはすべての__unsafe_unretained IBOutlets を変更しまし__weak IBOutletsたが、現在、メイン ビュー内にない IBOutlets はnil(を除くviewdidload) に設定されているため、後で追加することはできません。

私がそれについて考えると、ビュー(メインビュー)がそれらの IBOutlets を保持していない場合、割り当てを解除してゼロにする必要があるため(それが正しい言葉かどうかはわかりません)、解決策は__weakそれらからを削除することですIBアウトレット

しかし、私にとって意味をなさないのは、 と の間の動作が異なる理由ですunsafe_unretainedweak私の頭のunsafe_unretained中では、それらの割り当てを解除する必要があり、アプリがそれらにアクセスしようとすると、それらは無効な参照を指し、アプリがクラッシュするはずです。

unsafe__unretained は weak と同じですが、ゼロ化はしていないと思いました。

ここで何か不足していますか?

ありがとう。

4

3 に答える 3

5

unsafe__unretained は weak と同じですが、ゼロ化はしていないと思いました。

そうです。

viewDidLoadCocoa が nib をロードすると、自動解放されたすべてのオブジェクトが作成されるため、が呼び出されたときにオブジェクトはそのまま残ります。ただし、自動解放プールには、制御が実行ループに戻ると終了する有効期間があります。この時点で、何にも所有されていないすべてのオブジェクトがなくなるため、弱いアウトレットはその時点でゼロになります。

ほとんどのアウトレットでは、これは問題ではありません。なぜなら、NIB 内のオブジェクトは一般に、いずれにせよすでに所有されているからです。したがって、たとえば、ビュー内のボタンはその親ビューによって所有されます。したがって、そのボタンを指す強力なアウトレットを持つことは、やり過ぎであるか、さらに悪いことに、保持サイクルが発生する可能性があります。

トップレベルのオブジェクトには明らかにそれらを所有する親ビューがないため、コントローラーや「ファイルの所有者」など、他の何かによって所有される必要があります。消えたものを見つけた場合は、ファイルの所有者で強力な IBOutlet を作成する必要があります。

詳細については、Apple のドキュメントを参照してください。

于 2012-06-20T15:49:24.777 に答える