2017-02-02 4 views
2

Objective Cでは、ViewControllerにUIKitオブジェクトプロパティがある場合、viewと言うだけで、viewDidLoadでインスタンス化され、その後にサブビューに追加されます。それをメモリから取り除いて、removeFromSuperview()とオブジェクトをnilに設定する必要があります(私が間違っていない場合は...)ビュー、ARC、Objective CとSwiftとの相違点を削除する

しかし、Swiftでは、オプションの型nilの値を保持できます。

私のアプリケーション内でUILabelsやUIViewのようなものをアニメーション化し、後でそれらを消して(ユーザーとメモリから)削除したいのであれば、そのUIKitオブジェクトはremoveFromSuperView()で十分です?または、私はアニメーション化しようとしているすべてのオブジェクトをremoveFromSuperView()にしてからnilに設定する必要がありますか?

私の貧弱な発音をお詫びします。さらなる明確化が必要な場合は、私に知らせてください。あなたのご意見をありがとうございます。

+0

サブビューは、親オブジェクトの後で初期化されるため、通常はオプションです(所有しているインスタンスの初期化が完了する前に、非オプションのプロパティに値を設定する必要があります)。そのため、たとえば'@IBOutlet weak var myLabel:UILabel!'常に( '?'もやっているが便利ではない) –

+1

@NicolasMiariは正しい。私は2つのことを追加したいと思います:1)UIView型のプロパティをオプションにしない理由はほとんどありません。あなたのUIViewControllerの初期化を単純化し、2)removeFromSuperViewは単にUIView.removeSubview(:UIView)を呼び出します。オブジェクトをnilに設定しません。 – dylanthelion

答えて

3

weakプロパティオブジェクトの割り当てを解除したい場合は、それらをnilに設定するか、所有オブジェクトの割り当てを待つ必要があります。

weakではないプロパティ内のオブジェクトは、親オブジェクトが割り当て解除されたときにreleaseコールを取得します。つまり、他に何も参照がない場合、オブジェクトは割り当て解除されます。

UILabelを作成してView Controllerのプロパティではなく、アニメーション化した後にremoveFromSuperview()とすると、メモリからも消失するはずです。

アニメーションを作成する機能が動作していたとき、それは(refcount: 1)を保持したように、後でビュー階層(refcount: 2)によって、機能が(refcount: 1)を終了し、これだけのビュー階層には、それを維持しました。アニメーションの終了時に削除した場合は、(refcount: 0)は割り当て解除されます。

関連する問題