我在哪里泄漏记忆?二手仪器

时间:2012-01-20 19:19:53

标签: iphone objective-c cocoa-touch memory-leaks instruments

乐器说这段代码中存在内存泄漏:

- (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];
}

4 个答案:

答案 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,并且不发送autoreleaseEmployeeReservationQueue。另一种可能性是您泄漏了NSMutableArraymalloc

如果使用模拟器,则可以查看大多数对象的完整保留/释放历史记录。当泄露的对象出现时,将鼠标悬停在对象的地址上,然后单击地址旁边显示的右箭头。仪器会向您显示该对象的每个retainreleaseautoreleaseretain事件。如果您选择查看>从菜单栏中扩展详细信息,您可以单击任何这些事件并查看事件的堆栈跟踪。这可以帮助您追踪失衡的{{1}}。