这个问题看起来非常简单,但很难找到补救措施。 每次我在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];
}
答案 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
,这将从一开始就优化内存分配,并避免不必要的重新分配和复制。