/ / Стирання або шифрування пам'яті для NSObjects - ios, object-c, memory, nsobject

Видалення або шифрування пам'яті для NSObjects - ios, об'єктив-c, пам'ять, nsobject

Я намагаюся з'ясувати, чи є генералспосіб по суті стерти або зашифрувати пам'ять, пов'язану з NSObjects. Мені не дуже важливо, чи це трохи громіздко, я просто хочу переконатися, що його справді не можна прочитати.

Наприклад, якщо у мене є

NSString* str = [[NSString alloc] initWithFormat:@"TESTING"];

це зробити досить просто

unsigned char* strPtr = (unsigned char *) CFStringGetCStringPtr
((CFStringRef) str, CFStringGetSystemEncoding());
memset(strPtr, 0, [str length]);

І я можу зробити подібні речі для NSData. Але я дуже хотів би мати щось більш загальне.

Я придивився, не пощастивши:

  • Зони, схожі на те, що вони більше не використовуються.
  • Створення батьківського класу NSObject і внесення всього цього до нього та відстеження регіонів пам'яті. Це щойно було повним болем.
  • Шифрування фактичного вмісту даних та примушування до розшифровки доступу. Це повертається до проблеми знати щось про кожен тип.
  • Шифруючи, а потім розшифровуючи області пам'яті, не можна знайти спосіб надійно знати, де в пам’яті знаходиться загальний об’єкт.

Будь-які підказки чи ідеї були б дуже вдячні.

Відповіді:

0 для відповіді № 1

Ви можете додати категорію до NSObject, який використовує відображення через API виконання. Це можна використовувати для очищення ivars / властивостей, навіть властивостей, оголошених як лише прочитані.

Один недолік полягає в тому, що він не очищає певних властивостей, наприклад, кадру UIView, і я не впевнений, чому це пропускає.

NSObject + Scrub.h:

@interface NSObject (Scrub)

- (void) scrub;

@end

NSObject + Scrub.m:

#import "NSObject+Scrub.h"
#import <objc/runtime.h>

@implementation NSObject (Scrub)

- (void) scrub
{
Class myClass = [self class];

unsigned int count;

//Scrub the Ivars
Ivar *ivars = class_copyIvarList(myClass, &count);
for (int i = 0; i < count ; i++) {
Ivar ivar = ivars[i];
object_setIvar(self, ivar, nil);
}
free(ivars);

}

@end

Удачі!