我想弄清楚是否有一种通用方法可以从根本上删除或加密与 NSObjects 关联的内存。我真的不在乎它是否有点麻烦,我只是想确保它真的无法阅读。
例如,如果我有一个
NSString* str = [[NSString alloc] initWithFormat:@"TESTING"];
做起来比较简单
unsigned char* strPtr = (unsigned char *) CFStringGetCStringPtr
((CFStringRef) str, CFStringGetSystemEncoding());
memset(strPtr, 0, [str length]);
我可以为 NSData 做类似的事情。但我真的很想有一些更通用的东西。
我调查过,没有运气:
- 似乎不再使用的区域。
- 创建 NSObject 的父类并将所有内容转换为它并跟踪内存区域。不过,这真是一个彻头彻尾的痛苦。
- 加密数据的实际内容并在访问时强制解密。这又回到了了解每种类型的问题。
- 加密然后解密内存区域,无法找到可靠地知道一般对象在内存中的位置的方法。
任何提示或想法将不胜感激。
最佳答案
您可以通过运行时 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
祝你好运!
关于ios - 为 NSObjects 删除或加密内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17997213/