IOは、メモリ管理で非連続または連続の割り当てを使用しますか?ユーザーが128 MB以上を割り当てた場合、アプリは閉じられますか?または、ユーザーがメモリを割り当て、Deallocateメソッドで割り当て解除をミスしたかのように、メモリがiOSによって管理されますか?明確に定義されたデータ構造の割り当てを使用して、アプリケーションで120 MB以上を使用することは可能ですか?
個別のメモリ割り当てからのブロックは連続して割り当てられません(alloc、malloc、newなどの個別の呼び出し)。それ以外の場合、それらは連続して割り当てられます(mallocへの同じ呼び出しから、たとえば、新しいfloat [30])。 Appleによると、20MB以上のRAMを使用すると、メモリ使用量のためにアプリがシャットダウンするリスクがあります。しかし、実際には、約...
モバイルアプリケーションにそれほど多くのRAMが必要な場合は、データを一時ファイルに保存し、その上で処理を行う必要があります。これを行う簡単な方法は、メモリマップファイルを使用することです。
メモリ<デバイスのRAM容量を使用できます
(たとえば、40 MbのRAMを使用していて、短い計算のために80 Mb以上を割り当てています)。この場合、iOSはすぐにアプリケーションを強制終了します。1
このツール でテストしているユーザーが見つけた結果のリスト:
デバイス:(クラッシュ量/合計量/合計の割合)2
- iPad1:127MB/256MB/49%
- iPad2:275MB/512MB/53%
- iPad3:645MB/1024MB/62%
- iPad4:585MB/1024MB/57%(iOS 8.1)
- iPad Mini第1世代:297MB/512MB/58%
- iPad Mini Retina:696MB/1024MB/68%(iOS 7.1)
- iPad Air:697MB/1024MB/68%
- iPad Air 2:1195MB/2048MB/58%(iOS 8.x)
- iPad Pro 12.9:3064MB/3981MB/77%(iOS 9.3.2)
- iPad Pro 9.7 ":1395MB/1971MB/71%(iOS 10.0.2(14A456))
- iPod touch第4世代:130MB/256MB/51%(iOS 6.1.1)
- iPod touch第5世代:286MB/512MB/56%(iOS 7.0)
- iPhone4:325MB/512MB/63%
- iPhone4S:286MB/512MB/56%
- iPhone5:645MB/1024MB/62%
- iPhone5S:646MB/1024MB/63%
- iPhone6:645MB/1024MB/62%(iOS 8.x)
- iPhone6 +:645MB/1024MB/62%(iOS 8.x)
- iPhone6s:1396MB/2048MB/68%(iOS 9.2)
- iPhone6s +:1195MB/2048MB/58%(理論的、未テスト)
- iPhoneSE:1395MB/2048MB/69%(iOS 9.3)
- iPhone 6s +:1392MB/2048MB/68%(iOS 10.2.1)
- iPhone 7以降:2040MB/3072MB/66%(iOS 10.2.1)
- iPhone X:1392/2785/50%(iOS 11.2.1)
1 https://stackoverflow.com/a/5887783/5181636
2 https://stackoverflow.com/a/15200855/5181636
詳細については、この 質問 を参照してください。
現在、iOSのメモリ管理は、アプリケーションの明確なメモリ制限なしで機能します。ただし、iOSがアプリにメモリをすぐに解放するように指示した場合、またはメモリが閉じられる場合に対処できます。
128MBはiOSにとって非常に大きなメモリブロックです。メモリ制限を超えて割り当てようとすると、通知なしにアプリケーションが閉じられます。
内部では、iOSはmallocとフレンドを使用してすべてのオブジェクトにメモリを割り当てるため、返されるメモリは確かに連続しています。利用可能な連続メモリよりも多くを割り当てようとすると、malloc呼び出しはNULLを返します(適切にチェックされていない場合、nullポインタにアクセスしようとすると、おそらく他の何かが失敗します)
アプリのメモリ使用制限が128 MBかどうかはわかりません。しかし、より多くのメモリを消費すると、アプリケーションはメモリ警告を受け取ります。それらを処理し、後で作成できるキャッシュやその他のオブジェクトをクリアしても、アプリケーションは終了しません。それらを無視すると、アプリケーションは終了します。