Wenn ich den folgenden Code ausführe, frisst er langsam meinen Speicher auf und beginnt sogar, Swap zu verwenden:
long long length = 1024ull * 1024ull * 1024ull * 2ull; // 2 GB
db = [NSMutableData dataWithLength:length];
char *array = [db mutableBytes];
for(long long i = 0; i < length - 1; i++) {
array[i] = i % 256;
}
Wenn ich es ohne den for-Zyklus ausführe, wird überhaupt kein Speicher verbraucht:
long long length = 1024ull * 1024ull * 1024ull * 2ull;
db = [NSMutableData dataWithLength:length];
char *array = [db mutableBytes];
/* for(long long i = 0; i < length - 1; i++) {
array[i] = i % 256;
} */
Ich kann nur zu dem Schluss kommen, dass NSMutableData nur Speicher "reserviert", und wenn darauf zugegriffen wird, wird er tatsächlich "zugewiesen". Wie wird das genau gemacht?
Erfolgt dies über die Hardware (CPU)?
Gibt es eine Möglichkeit für NSMutableData zu fangen Speicher schreibt in seinem "reservierten" Speicher und nur dann tun die "Zuordnung"?
Bedeutet dies auch, dass ein Aufruf von [NSMutableData dataWithLength:length]
niemals scheitern kann? Kann er jede beliebige Speichergröße zuweisen, indem er Swap verwendet, um sie bei Bedarf zu erhalten?
Wenn es fehlschlagen kann, wird meine db-Variable null sein?
In der "NSMutableData Class Reference" von Apple habe ich nur vage Sätze zu diesen Themen gesehen.