gpt4 book ai didi

iPhone内存泄漏和malloc?

转载 作者:行者123 更新时间:2023-12-03 20:26:47 30 4
gpt4 key购买 nike

好吧,我终于可以在实际的 iPad 上测试我的 iPad 应用程序了...

我的应用程序所做的一件事是在 ScrollView 中显示大(2mb)图像。这导致 iPad 收到内存警告。我在仪器中运行该应用程序来检查是否有泄漏。

当我加载图像时,检测到泄漏,并且我在分配中看到以下内容:

所有分配:83.9 MBMalloc 48.55 MB:48.55 MBMalloc 34.63 MB:34.63 MB

我想了解的是如何明显地堵塞泄漏,以及为什么 2MB 图像会导致 20 倍大小的 malloc

我对 obj-c 编程非常陌生,所以我确信这是一件显而易见的事情,但我就是无法弄清楚。这是代码:

@interface ChartsViewController : UIViewController <UIScrollViewDelegate, UIPickerViewDelegate, UIPickerViewDataSource> {
IBOutlet UIScrollView *scrollView;
UIImageView *imageView;
NSString *chart;
NSString *chartFile;
UIPickerView *picker;
NSDictionary *chartsDictionary;
NSArray *chartTypes;
NSArray *charts;
IBOutlet UILabel *chartNameLabel;
IBOutlet UIActivityIndicatorView *activityIndicator;



}

@property (nonatomic, retain) UIScrollView *scrollView;
@property (nonatomic, retain) UIImageView *imageView;
@property (nonatomic, retain) NSString *chart;
@property (nonatomic, retain) NSString *chartFile;
@property (nonatomic, retain) IBOutlet UIPickerView *picker;
@property (nonatomic, retain) NSDictionary *chartsDictionary;
@property (nonatomic, retain) NSArray *chartTypes;
@property (nonatomic, retain) NSArray *charts;
@property (nonatomic, retain) IBOutlet UILabel *chartNameLabel;
@property (nonatomic, retain) IBOutlet UIActivityIndicatorView *activityIndicator;


-(IBAction) chartSelected;
- (void)alertView:(UIAlertView *)actionSheet

////////////////////////////////

-(IBAction) chartSelected {
[imageView removeFromSuperview];
imageView = nil;
chartNameLabel.text = @"";

NSInteger chartTypeRow = [picker selectedRowInComponent:kChartTypeComponent];
NSInteger chartRow= [picker selectedRowInComponent:kChartComponent];
chart = [self.charts objectAtIndex:chartRow];
chartFile = [chart stringByReplacingOccurrencesOfString:@" " withString:@"_"];


NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES);


NSString *docsPath = [paths objectAtIndex:0];
NSString *tempString = [[NSString alloc]initWithFormat:@"%@/%@.jpg",docsPath,chartFile];




NSData *temp = [NSData dataWithContentsOfFile:tempString];

if (temp != NULL){

temp = nil;
[imageView removeFromSuperview];
imageView = nil;

UIImageView *tempImage = [[UIImageView alloc]initWithImage:[UIImage imageWithContentsOfFile: tempString]];
[tempString release];
self.imageView = tempImage;


scrollView.contentSize = CGSizeMake(imageView.frame.size.width , imageView.frame.size.height);
scrollView.maximumZoomScale = 4.0;
scrollView.minimumZoomScale = .05;
scrollView.clipsToBounds = YES;
scrollView.delegate = self;
scrollView.zoomScale = .3;

[scrollView addSubview:imageView];
[tempImage release];
imageView = nil;
chartNameLabel.text = chart;

}

else {

UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Download Chart"
message:@"It appears that you have not yet downloaded this chart. Press OK to download this chart to your iPad. Depending on your internet connection, the download could take several minutes."
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:@"Cancel", nil];
[alert show];
[alert release];

}

}

- (void)dealloc {

[imageView release];
[scrollView release];
[chartsDictionary release];
[picker release];
[chartTypes release];
[charts release];
[super dealloc];
}

最佳答案

你说你有一个 2MB 的图像。但这意味着 2MB JPG,对吗?

那么像素大小是多少 - 因为当您将图像加载到内存中时,它必须被解压缩。这意味着内存中的大小将是水平分辨率 * 垂直分辨率 * 8 * 4(Alpha channel )字节

这就是为什么您每次加载镜像时都会看到分配了 20-30MB,无论保留问题如何(这仅意味着分配的每个 30MB 都不会被释放)。

关于iPhone内存泄漏和malloc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2696245/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com