回答編集履歴

2

deinit を追加

2020/05/10 05:46

投稿

TsukubaDepot
TsukubaDepot

スコア5086

test CHANGED
@@ -31,3 +31,51 @@
31
31
 
32
32
 
33
33
  また、遷移先で`dismiss`し元に戻ってきても、PickerView は表示されたままとなるため、あまり良いインタフェイスデザインではないかと思います。
34
+
35
+
36
+
37
+ ---
38
+
39
+
40
+
41
+ 私がクラスのライフサイクルについて疑問を持ったときによく使う手は、`deinit {}` を定義することです。
42
+
43
+
44
+
45
+ `deinit`を使うことでインスタンス化されたクラスがその寿命を終えたときに何らかのメッセージをコンソールに表示させることが可能となります。
46
+
47
+
48
+
49
+ たとえば、`UIImagePickerController` であれば、
50
+
51
+ ```swift
52
+
53
+ class MyImagePickerController: UIImagePickerController {
54
+
55
+ deinit {
56
+
57
+ print("deinit: MyImagePickerController")
58
+
59
+ }
60
+
61
+ }
62
+
63
+
64
+
65
+ //
66
+
67
+ let imagePicker = MyImagePickerController()
68
+
69
+ ```
70
+
71
+
72
+
73
+ のように定義しておくことで、UIImagePicker のインスタンスが使命を終えたときにコンソールにメッセージを表示させます。
74
+
75
+
76
+
77
+ このようにしておけば、画面から UIImagePicker が消えたときにメッセージが表示されればインスタンスも修了していることがわかりますし、表示されなければ何らかの理由で残っていることが把握できます。
78
+
79
+
80
+
81
+ 普段よく使う`ViewController`なども、同じく `deinit {}`を定義しておけば、画面遷移のときにどのように扱われるのか把握することも可能です。

1

コメントを受けて変更

2020/05/10 05:46

投稿

TsukubaDepot
TsukubaDepot

スコア5086

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