65592


以下のようにInt型のnumbersという配列があった場合  
numbers = []とすれば配列は空になると思いますが、これでメモリ的にも問題ない動作になりますでしょうか？

[code]

    var numbers: [Int] = []
    
    for count in 0...1000 {
      numbers.append(count)
    }
    numbers = []　//初期化
    
    for count in 0...5000 {
      numbers.append(count)
    }
    numbers = []　//初期化
    
[/code]

これに似たコードを書いているのですが、複数回実行していると挙動が重くなりおかしくなり始めるので  
何かメモリ内にゴミが貯まっているのかもしれないと思い、質問させて頂くことにしました。

実際のコードではクロージャなども使用して配列に対して値を代入しています。


CC BY-SA 4.0
2020-04-13T04:50:30.887
65576
2020-04-13T12:44:06.307
36446
question
swift
Swiftで配列のリセットとメモリ解放について


「これで」と言うのがご質問に書かれたコードのことを指しているのであれば、何の問題もありません。

**_これに似たコードを書いている_**

ご質問のコードには何の問題もありませんが、それに似たあなたのコードに問題がないかどうかはコードを見ないと何とも言えません。あなたにとっては「これくらいは本質的な違いではない」と思って、簡略化したコードを掲載されているのだと思うのですが、そのほんのちょっとの差が大きな違いを生んでいるかもしれません。

**_実際のコードではクロージャなども使用して_**

そのクロージャは例えば非同期処理に関わってメインスレッド以外から実行されていると言うことはないでしょうか?Swiftの配列はスレッドセーフではないので、複数スレッドから同時にアクセスするようなことがあれば「挙動が重く」なったり、クラッシュしたり、場合によってはCPUが暴走してデバイスが過熱して爆発する、なんてことも可能性としては考えられます。

* * *

Swiftの配列は値型としての振る舞いをしないといけない上に、Objective-
Cの`NSArray`と相互変換できるように考えられているため、裏ではかなり複雑なことをやっています。そのせいで極めて限定的な場合にだけ発生するバグ、とかが、いままでになかったわけではないですが、そんなものに遭遇することは滅多にありません。

「挙動が重くなりおかしくなり始める」なんてことがあるのなら、あなたがお示しにならなかった部分で、何か変なことをしている可能性が大と考えられます。

「複数回実行していると挙動が重くなりおかしくなり始める」と言う現象が再現できるようなコードはご提示いただけないでしょうか?
現在示されているコードを10万回ばかり繰り返して実行してみましたが、「挙動が重くなり」なんて事象は再現できませんでした。


CC BY-SA 4.0
2020-04-13T12:44:06.307
65592
2020-04-13T12:44:06.307
13972
65576
answer