擦除或加密NSObjects的内存

时间:2013-08-01 14:44:54

标签: ios objective-c memory nsobject

我正在试图弄清楚是否存在一种基本上擦除或加密与NSObject相关联的内存的通用方法。我真的不在乎它是否有点麻烦,我只是想确保它真的无法读取。

例如,如果我有

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

做起来相对简单

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

我可以为NSData做类似的事情。但我真的想要更通用的东西。

我已经调查过,没有运气:

  • 区域,似乎已不再使用。
  • 创建NSObject的父类并将所有内容转换为内容并跟踪内存区域。这只是一个彻底的痛苦。
  • 加密数据的实际内容并强制解密访问。这又回到了解每种类型的问题。
  • 加密然后解密内存区域,找不到可靠地知道一般对象在内存中的位置的方法。

非常感谢任何提示或想法。

1 个答案:

答案 0 :(得分:0)

您可以向通过运行时API使用反射的NSObject添加类别。这可用于清除ivars / properties,甚至是声明为readonly的属性。

一个缺点是它没有清除某些属性,例如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
祝你好运!