【发布时间】:2013-06-22 14:00:11
【问题描述】:
我的 iPhone 应用程序出现问题,当我在 iPod 上运行它时,它需要 10 多分钟才会崩溃并关闭。 因此,我查找了配置文件统计信息,并且似乎是高 Live Bytes,如下图所示:
任何人都可以帮助我减少此 Live Bytes 以避免崩溃?
编辑: 我在调用 viewDidLoad 时使用了三个 for 循环,这三个循环从引用中获取图像,所以我认为它会让应用程序崩溃? 那么在不导致崩溃的情况下执行这三个 for 循环的替代方法是什么?
编辑 2: 这是我的视图加载,每个循环从不同的文件夹中获取不同的图像,所有这些都是必要的
编辑3:对于文件夹a,它有100张图片,其中一半是每张图片的缩略图,对于文件夹b,30张图片,最后是文件夹c 90张图片,其中一半是缩略图对于每张图片,所有文件夹都在引用中,因此它没有从互联网上获取任何图片...
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSInteger x = 6;
NSString *resourcePath = [[NSBundle mainBundle] resourcePath];
NSString *aPath = [resourcePath stringByAppendingPathComponent:@"a"];
NSArray *aDirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:aPath error:nil];
for (NSString *tString in aDirContents) {
if ([tString hasSuffix:@".jpg"]) {
UIButton *item = [UIButton buttonWithType:UIButtonTypeCustom];
[item setFrame:CGRectMake(x, 5, 60, 60)];
x += 63;
NSString *result = [tString substringToIndex:[tString length] - 4];
[item setTitle:result forState:UIControlStateNormal];
[item setTitleColor:[UIColor clearColor] forState:UIControlStateNormal];
[item setBackgroundImage:[UIImage imageNamed:tString] forState:UIControlStateNormal];
[item addTarget:self action:@selector(changeFont:) forControlEvents:UIControlEventTouchUpInside];
[aSlider addSubview:item];
}
}
aSlider.frame = CGRectMake(aSlider.frame.origin.x, aSlider.frame.origin.y, x, 69);
[aSliderContainer setContentSize:aSlider.frame.size];
x = 6;
NSString *bPath = [resourcePath stringByAppendingPathComponent:@"b"];
NSArray *bDirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:bPath error:nil];
for (NSString *tString in bDirContents) {
if ([tString hasSuffix:@".jpg"]) {
UIButton *item = [UIButton buttonWithType:UIButtonTypeCustom];
[item setFrame:CGRectMake(x, 5, 60, 60)];
x += 63;
NSString *result = [tString substringToIndex:[tString length] - 4];
[item setTitle:result forState:UIControlStateNormal];
[item setTitleColor:[UIColor clearColor] forState:UIControlStateNormal];
[item setBackgroundImage:[UIImage imageNamed:tString] forState:UIControlStateNormal];
[item addTarget:self action:@selector(changeFont:) forControlEvents:UIControlEventTouchUpInside];
[bSlider addSubview:item];
}
}
bSlider.frame = CGRectMake(bSlider.frame.origin.x, bSlider.frame.origin.y, x, 69);
[bSliderContainer setContentSize:bSlider.frame.size];
// c Slider
x = 6;
NSString *cPath = [resourcePath stringByAppendingPathComponent:@"c"];
NSArray *cDirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:cPath error:nil];
for (NSString *tString in cDirContents) {
if ([tString hasSuffix:@".jpg"]) {
UIButton *item = [UIButton buttonWithType:UIButtonTypeCustom];
[item setFrame:CGRectMake(x, 5, 60, 60)];
x += 63;
NSString *result = [tString substringToIndex:[tString length] - 4];
[item setTitle:result forState:UIControlStateNormal];
[item setTitleColor:[UIColor clearColor] forState:UIControlStateNormal];
[item setBackgroundImage:[UIImage imageNamed:tString] forState:UIControlStateNormal];
[item addTarget:self action:@selector(changeFont:) forControlEvents:UIControlEventTouchUpInside];
[cSlider addSubview:item];
}
}
cSlider.frame = CGRectMake(cSlider.frame.origin.x, cSlider.frame.origin.y, x, 69);
[cSliderContainer setContentSize:cSlider.frame.size];
}
【问题讨论】:
-
我的应用程序的“Live Bytes”有时几乎是 120 MB,但仍然不会崩溃(在 iPad2 或更高版本上)。我不认为实时字节是你的问题。
-
5.7 mb 看起来并不离谱,所以首先确认内存消耗是导致崩溃的原因。但是如果你想减少内存消耗,你必须(a)确保你没有任何泄漏或保留周期; (b) 查看您的应用正在创建哪些对象,并尽可能将其最小化。避免,例如,加载图像数组或类似的愚蠢的事情,采用延迟加载,回复
didReceiveMemoryWarning,等等。我不知道我们还能如何帮助你,关于你的应用程序的信息如此之少,细节崩溃,内存使用等。 -
首次运行分析器。这将有助于发现任何存储泄漏,还有助于识别其他一些错误。
-
@Putz1103 你能看到编辑吗
-
@Rob 我已经更新了我的 viewDidLoad
标签: iphone ios objective-c byte