我正在开发一个由另一家公司开发的iOS应用程序的新版本,但现在我的责任。我对目标C以及特别是iOS开发的经验很少,但我会尽力传达我的问题。
我有以下方法,我在改进过程中既没有做出也没有改变:
- (Boolean)ShouldWeDownloadImage:(NSString*)p_ImageName
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *filePath = [NSString stringWithFormat:@"%@/%@", [paths objectAtIndex:0], p_ImageName];
NSFileManager *fileManager = [NSFileManager defaultManager];
if (!([fileManager fileExistsAtPath:filePath]))
return true;
NSDate *creationDate = [[fileManager attributesOfItemAtPath:filePath error:nil]objectForKey:NSFileCreationDate];
NSDate *currentDate = [NSDate date];
NSCalendar *gregorian = [[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *dateComponents = [gregorian components:NSMonthCalendarUnit fromDate:creationDate toDate:currentDate options:0];
if ([dateComponents month] > MaxAgeOfDownloadedImage)
return true;
return false;
}
这种特殊的方法被大量调用。我的意思很多;事实上,短暂连续几十次(甚至数百次)。调用它的方法以及调用它的方法也是如此。我的问题是,每当我启动我的应用程序时,它会立即开始下载任何所需的图像,几秒钟后,当我在实际设备上运行时,应用程序将崩溃。然而,模拟器很好,运行应用程序没有任何问题。值得注意的是,模拟器运行iOS7,我测试的物理设备运行iOS6。我没有其他可以测试的设备。
当应用程序崩溃时,我在此方法的第一行收到一条EXC_BAD_ACCESS消息。怀疑它可能是因为对此方法的许多后续调用以及这可能对内存使用产生的影响,我将paths
数组的定义移动到另一个类,在该类中永久存储并通过传递它重用将此方法作为参数。在我这样做之后,应用程序不再在第一行崩溃,而是在NSCalendar的定义上崩溃。我认为应用程序可以在没有时间戳检查的情况下进行操作并对该代码进行评论,但是一旦我做了,该方法的新第一行(filePath的定义)使应用程序崩溃。
最好的部分:如果我取出所有这些代码并从这个方法返回true,那么应用程序工作正常,这让我相信无论出现什么问题,这个方法都是错误的,只有在这个方法中。
值得注意的是:该项目已转换为ARC以尝试帮助解决此问题,但无济于事。我也尝试过启用僵尸对象来提供更多信息,但即使打开它也无法在调试时找到任何有用的信息。
有谁知道这个方法可能出错了什么以及如何解决?简单地返回true将使应用程序可用,但这不是一个可接受的解决方案,因为这意味着它将通过用户昂贵的数据计划下载大量不必要的数据。