乐器说这段代码中存在内存泄漏:
- (void)layoutImageMaskViewForImageAtPath:(NSString *)path withFillColor:(UIColor *)color indexPath:(NSIndexPath *)indexPath {
UIImage *image = [UIImage imageWithContentsOfFile:path];
[self layoutImageMaskViewForImage:image withFillColor:color indexPath:indexPath];
}
UIColor *anIconFillColor = [UIColor colorWithWhite:0.70 alpha:1.0];
NSIndexPath *anIndexPath = [NSIndexPath indexPathForRow:0 inSection:0];
NSString *aPlaceholderPath = [[NSBundle mainBundle] pathForResource:@"path" ofType:@"png"];
[self layoutImageMaskViewForImage:anImage withFillColor:anIconFillColor indexPath:anIndexPath];
和
NSDictionary *anAssignedData = [aReservationData objectForKey:kAssignedSectionKey];
NSMutableArray *anEmployeeTaskQueueList = [NSMutableArray array];
NSArray *anAssignedReservationData = [anAssignedData objectForKey:kEmployeesIdentifier];
for (NSDictionary *aJobQueueData in anAssignedReservationData) {
EmployeeReservationQueue *anAssignedTaskQueue = [[EmployeeReservationQueue alloc] initWithServerDictionary:aJobQueueData];
if (anAssignedTaskQueue.rows.count == 0) {
ReservationTrack *aTrack = [[ReservationTrack alloc] init];
aTrack.rowSortOrder = 0;
aTrack.reservations = [NSArray array];
anAssignedTaskQueue.rows = [NSArray arrayWithObject:aTrack];
[aTrack release];
}
[anEmployeeTaskQueueList addObject:anAssignedTaskQueue];
[anAssignedTaskQueue release];
}
答案 0 :(得分:1)
您的第二个示例泄漏track
。您的最后一行是发布aTrack
。
答案 1 :(得分:1)
在第二种情况下:
[aTrack release];
什么是aTrack
?你的意思是[track release];
?
在第一种情况下,可能是您传递给非自动释放函数的函数,或者您可能在调用该方法后没有释放它们。只需在您调用该方法的地方发布代码,我就会检查。
答案 2 :(得分:1)
Objective-C中的金记忆管理规则:
每个'init','copy','mutableCopy','retain'必须调用'release'或'autorelease'。
答案 3 :(得分:0)
Instruments报告您的应用正在泄漏ReservationTrack
个对象。默认情况下,它显示泄漏对象的分配位置,即您发布的代码。您发布的代码不会泄漏ReservationTrack
。它将其存储在EmployeeReservationQueue
中,该NSMutableArray
存储在ReservationTrack
中。一种可能性是您稍后访问retain
对象,发送release
,并且不发送autorelease
或EmployeeReservationQueue
。另一种可能性是您泄漏了NSMutableArray
或malloc
。
如果使用模拟器,则可以查看大多数对象的完整保留/释放历史记录。当泄露的对象出现时,将鼠标悬停在对象的地址上,然后单击地址旁边显示的右箭头。仪器会向您显示该对象的每个retain
,release
,autorelease
和retain
事件。如果您选择查看>从菜单栏中扩展详细信息,您可以单击任何这些事件并查看事件的堆栈跟踪。这可以帮助您追踪失衡的{{1}}。