Я намагаюся з'ясувати, чи є генералспосіб по суті стерти або зашифрувати пам'ять, пов'язану з 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
Удачі!