我有一个 iPhone 应用程序收到内存警告,因此我试图在 Instruments 的帮助下找到泄漏、更有效地利用内存等。除其他外,我正在尝试取出任何自动释放的对象并用手动分配/初始化/释放对象替换。但是,某些 API 调用似乎没有“init”版本(参见下面的代码)。我承认有一些基本的误解:
如果我“调用”API 并取回本质上是自动释放的对象,这些对象会在 Instruments 中显示为泄漏吗?看来我在 Instruments 中看到了这种行为。
如果是 2,如果没有“非自动释放”替代方案并且我正在使用我需要的 API,我是否应该忽略?另外,如果这段代码被多次调用,我应该完全重新考虑算法吗?
这是我的应用程序中的一些实用程序代码,它们经常被调用。基本上确定两个日期是否有意义地“相等”。我留下了注释掉的代码,所以你可以看到我在我的代码库中追求的改进类型——当我开始手动创建 NSDate(和发布)时,这个 DID 减少了随后在 Instruments 中运行时的内存泄漏帮助。但是,我仍然有我认为正在泄漏的日期组件对象......但它是一个 API 调用(抱歉代码格式,但我似乎无法改进它):
+ (BOOL)isDayEqualToDay:(NSDate*)date anotherDate:(NSDate*)anotherDate
{
NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
//NSCalendar *cal;
NSDateComponents *componentsFromDate, *componentsFromAnotherDate;
NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
//cal = [NSCalendar currentCalendar];
componentsFromDate = [cal components:unitFlags fromDate:date];
componentsFromAnotherDate = [cal components:unitFlags fromDate:anotherDate];
BOOL bDatesEqual = ([componentsFromDate year] == [componentsFromAnotherDate year] &&
[componentsFromDate month] == [componentsFromAnotherDate month] &&
[componentsFromDate day] == [componentsFromAnotherDate day]);
[cal release];
return bDatesEqual;
/*
return (
[componentsFromDate year] == [componentsFromAnotherDate year] &&
[componentsFromDate month] == [componentsFromAnotherDate month] &&
[componentsFromDate day] == [componentsFromAnotherDate day]
);*/
}
我认为 componentsFromDate 和 componentsFromAnotherDate 显示为泄漏,但实际上只是从 NSData API 调用(自动释放)返回的对象。不知道我还能做些什么来提高效率,我质疑我对如何最好地使用 Instruments 的理解。建议?