3

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

例如,如果我有一个

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

做起来相对简单

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

我可以为 NSData 做类似的事情。但我真的很想有更一般的东西。

我调查过,没有运气:

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

任何提示或想法将不胜感激。

4

1 回答 1

0

您可以通过运行时 API 向使用反射的 NSObject 添加类别。这可用于清除 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

祝你好运!

于 2015-01-12T08:09:54.857 回答