Безопасное освобождение объекта ObjC на устройстве iOS - PullRequest
4 голосов
/ 03 ноября 2010

Что происходит с объектом, когда он освобожден? Вся память обнулена или следы остались?

Если я правильно понимаю, память приложения сохраняется во флэш-памяти, если она уходит в отставку. Предположим, что находчивый хакер может прочитать эту память. Сможет ли он теоретически иногда прочитать содержимое освобожденной NSString, если эта память чем-то не была перезаписана?

Ответы [ 3 ]

5 голосов
/ 03 ноября 2010

Не храните защищенные данные в типах данных Objective C.Это непрозрачные типы данных, и они могут создавать и / или оставлять множество копий ваших данных в памяти каждый раз, когда вы пытаетесь даже очистить какую-то часть.

Добавлено: То же самое относится и к типам данных Swift, в том числе структуры, массивы и строки.Они непрозрачны, поэтому кто знает, сколько копий данных может быть оставлено в DRAM.

Используйте непрозрачные простые типы данных C (массив символов и т. Д.), Которые вы можете использовать как только вызакончили использовать их, и всякий раз, когда приложение уходит в отставку, будучи активным.Вы также можете запутать элементы массива, чтобы сделать поиск строк по дампам памяти немного сложнее.

1 голос
/ 03 ноября 2010

Итак, вы также подняли вопрос о списании во Flash.Если ваше приложение переходит в фоновый режим, оно не обязательно освободит объекты - и даст вам возможность стереть их (как обсуждалось в другом ответе).

ЕСЛИ вы действительно обеспокоеныоб этом - я бы отключил быстрое переключение приложений в вашем приложении, чтобы гарантировать, что этого никогда не произойдет, в дополнение к реализации какого-либо кода переопределения объектов в dealloc, как обсуждалось выше.

1 голос
/ 03 ноября 2010

Даже с джейлбрейкнутым iDevice это маловероятно, так как место для памяти, вероятно, очень глубокое.Если вы действительно обеспокоены этим, вот решение, если вы не беспокоитесь о накладных расходах NSMutableString (dealloc вашего класса):

-(void) dealloc
{
    for (int i = 0; i < [myString length]; i++)
    {
          [myString replaceCharactersInRange:NSMakeRange(i, 1) withString:@"*"];
    }
    [myString release]; // or dealloc
    // clean up rest
    [super dealloc]; // dont forget this :)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...