teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

deinit を追加

2020/05/10 05:46

投稿

TsukubaDepot
TsukubaDepot

スコア5086

answer CHANGED
@@ -14,4 +14,28 @@
14
14
 
15
15
  **しかし、イメージピッカーのように複雑な処理や排他的な処理を行なっている可能性があるビューをdismissしないまま残しておくと悪い影響があると考えられますし、このような呼び出し方はOSのアップグレードに伴い使えなくなる(エラーになる)可能性もありますので、一旦イメージピッカーはdismissしてから新しいビューを開く(画面を遷移する)方が確実かと思います**(hosi-takanoriさん、いつもコメントありがとうございます)。
16
16
 
17
- また、遷移先で`dismiss`し元に戻ってきても、PickerView は表示されたままとなるため、あまり良いインタフェイスデザインではないかと思います。
17
+ また、遷移先で`dismiss`し元に戻ってきても、PickerView は表示されたままとなるため、あまり良いインタフェイスデザインではないかと思います。
18
+
19
+ ---
20
+
21
+ 私がクラスのライフサイクルについて疑問を持ったときによく使う手は、`deinit {}` を定義することです。
22
+
23
+ `deinit`を使うことでインスタンス化されたクラスがその寿命を終えたときに何らかのメッセージをコンソールに表示させることが可能となります。
24
+
25
+ たとえば、`UIImagePickerController` であれば、
26
+ ```swift
27
+ class MyImagePickerController: UIImagePickerController {
28
+ deinit {
29
+ print("deinit: MyImagePickerController")
30
+ }
31
+ }
32
+
33
+ //
34
+ let imagePicker = MyImagePickerController()
35
+ ```
36
+
37
+ のように定義しておくことで、UIImagePicker のインスタンスが使命を終えたときにコンソールにメッセージを表示させます。
38
+
39
+ このようにしておけば、画面から UIImagePicker が消えたときにメッセージが表示されればインスタンスも修了していることがわかりますし、表示されなければ何らかの理由で残っていることが把握できます。
40
+
41
+ 普段よく使う`ViewController`なども、同じく `deinit {}`を定義しておけば、画面遷移のときにどのように扱われるのか把握することも可能です。

1

コメントを受けて変更

2020/05/10 05:46

投稿

TsukubaDepot
TsukubaDepot

スコア5086

answer CHANGED
@@ -5,11 +5,13 @@
5
5
  //picker.dismiss(animated: true, completion: nil)
6
6
  ```
7
7
 
8
- 上記の行は削除し、次のような感じで PickerView の上に`FromCameraViewController` を表示させることは可能です(お作法として良いか否かは別として)
8
+ 上記の行は削除し、次のような感じで PickerView の上に`FromCameraViewController` を表示させることは可能です。
9
9
 
10
10
  ```swift
11
11
  //self.present(fromCameraVC, animated: true, completion: nil)
12
12
  picker.present(fromCameraVC, animated: true, completion: nil)
13
13
  ```
14
14
 
15
- ただ、遷移先で`dismiss`ってきても、PickerView は表示されたままとため、あ良いインタフェイスデザインではいかと思います。
15
+ **、イメージピッカーのよう複雑な処理や排他的な処理を行なっている可能性があるビューをdismissしないまま残しておく悪い影響があと考えられますしこのような呼び出し方はOSのアップグレードに伴い使えなくなる(エラーになる)可能性もありますの、一旦イメージピッカーdismissしてから新しビューを開く(画面を遷移する)方が確実かと思います**(hosi-takanoriさん、いつもコメントありがとうございます)
16
+
17
+ また、遷移先で`dismiss`し元に戻ってきても、PickerView は表示されたままとなるため、あまり良いインタフェイスデザインではないかと思います。