ios - 为 NSObjects 删除或加密内存

标签 ios objective-c memory nsobject

我想弄清楚是否有一种通用方法可以从根本上删除或加密与 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/

相关文章:

ios - 无法从 iPhone 文档目录位置中保存的文件重新加载 UIImage

ios - 使用 Rx 扩展模拟一个类

ios - 隐藏 MPRemoteCommand 向前搜索和向后搜索

iphone - 在iphone上渲染后是否有任何框架可以突出显示pdf文件上的文本

Python 2.6 GC出现清理对象,但内存并未释放

c++ - 阻止访问 Windows 上的物理地址

ios - 如何发送带有附件的GTLRGmail_Message

ios - 复杂的 Storyboard导航

objective-c - OS X 如何指定启动 View Controller

javascript - 你如何在Javascript中清除内存?