Это не столько проблема NSMutableData, сколько проблема ядра / ОС. Если процесс запрашивает (большой) кусок памяти, ядро, как правило, просто скажет: «все в порядке, поехали». Но только при фактическом использовании он действительно («физически») выделяется. Это нормально, поскольку если ваша программа запускается с malloc 2 ГБ (как вы делаете здесь), в противном случае она мгновенно вытеснит другие программы для замены, хотя на практике вы часто не сразу используете 2 ГБ.
При доступе к странице памяти, которая фактически отсутствует в физической памяти, ядро получит сигнал от ЦП. Если страница должна быть там (потому что она находится в пределах вашего блока размером 2 ГБ), она будет помещена на место (возможно, из раздела подкачки), и вы даже не заметите. Если страницы не должно быть (поскольку адрес не выделен в вашей виртуальной памяти), вы получите ошибку сегментации (ошибка типа SIGSEGV или EXC_BAD_ACCESS).
Одной из смежных тем является «чрезмерное обязательство», когда ядро обещает больше памяти, чем фактически доступно. Это может вызвать серьезные проблемы, если все процессы начнут использовать свою обещанную память. Это зависит от ОС.
В Интернете много страниц, объясняющих это лучше и более подробно; Я просто хотел дать краткое вступление, чтобы у вас были условия для Google.
edit , только что протестированный, linux легко пообещает мне 4 ТБ памяти, в то время как, уверяю вас, нет даже 1 ТБ общего диска хранилища на этой машине. Вы можете себе представить, что это, если не позаботиться о нем, может вызвать некоторые головные боли при создании критически важных систем.