UITextView在IOS中消耗大量内存

时间:2014-03-19 23:33:10

标签: ios iphone objective-c uitextview

这个问题看起来非常简单,但很难找到补救措施。 每次我在iPhone上使用UITextView时,Xcode中显示的内存使用量显示异常巨大的利用率。例如,当我向上和向下滚动时,包含短段(大约1KB)的UITextView消耗大约17-18mB的内存。更不用说100KB文件的大文本量,需要半分钟加载到视图。

以下是我在viewDidLoad()中实现它的方法 我不认为它与代码有任何关系,因为它完全是同一个问题 我在故事板中创建了一个新的UITextView,里面有默认的示例文本。

我有一个NSString,它读取文件内容并使UITextView将NSString显示为其文本。

@interface FileContentViewController ()
@property (weak, nonatomic) IBOutlet UILabel *fileNameTextLabel;
@property (weak, nonatomic) IBOutlet UITextView *fileContentView;
@end

@implementation FileContentViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)displayFileContentInTxtView
{
    if (!self.fileData) {
        self.fileContentView.text=@"file is empty";
        return;
    }

    unsigned char *fileContentBuffer=(unsigned char *)[self.fileData bytes];
    NSString *fileContentString=@"";
    for(int i=0;i<[self.fileData length];i++)
    {
        fileContentString=[fileContentString stringByAppendingString:[NSString stringWithFormat:@"%02x",*(fileContentBuffer+i)]];
    }
    self.fileContentView.text=fileContentString;
    self.fileData=nil;
}


- (void)viewDidLoad
{
    [super viewDidLoad];
    self.fileNameTextLabel.text=self.titleLabelText;
    [self displayFileContentInTxtView];
}

2 个答案:

答案 0 :(得分:0)

尝试使用UITextView显示文本而不是阅读文件内容,您可以使用不太多的代码执行此操作:

YourTextViewName.text = @"[put the text to display here]";

或者您可以尝试摆弄appdelegate.m文件的voidDidReceiveMemoryWarning部分

OR

您可以尝试显示正在提取内容的文件,并删除提取内容的代码。

答案 1 :(得分:0)

效率非常低

unsigned char *fileContentBuffer=(unsigned char *)[self.fileData bytes];
NSString *fileContentString=@"";
for(int i=0;i<[self.fileData length];i++)
{
    fileContentString=[fileContentString stringByAppendingString:[NSString stringWithFormat:@"%02x",*(fileContentBuffer+i)]];
}

原因是stringByAppendingString的每次调用都会分配内存来创建新的NSString对象。因此,如果你的文件大小为2KB,你将创建2048个NSString对象,并且每个字符串每次都包含一个字符,所以你常规最终使用n(n + 1)/ 2个字节而不释放它(对于2K文件,大约1MB的内存),这不考虑NSString的内部内存需求。

尝试这样的事情

NSMutableString *fileContentString = [[NSMutableString alloc] initWithCapacity:2*[self.fileData bytes]];
for(int i=0;i<[self.fileData length];i++)
    [fileContentString appendFormat:@"%02x", fileContentBuffer+i];

注意使用initWithCapacity,这将从一开始就优化内存分配,并避免不必要的重新分配和复制。