Помогите с утечкой функции - PullRequest
0 голосов
/ 22 января 2011
-(void)determineClosestLocationToUser:(NSArray *)allLocations
                                locationOfUser:(MapLocation *)userLocationIn
{   
    // Determine how many objects you have in the array (incase you'e too lazy to count, or changed the  
    // code to enter locations dynamically
    NSUInteger counter = [allLocations count];

    // set this value to the first item in the array, so it has something to compare to
    closestLocationFound = [allLocations objectAtIndex:0];

    // run a for loop to compare each of the locations in the array against the user location to determine
    // which location is the closest
    for(NSUInteger i = 0; i < counter; i++)
    {
        // setup 2 variables to hold the distances between the user and both locations for comparison
        CLLocationDistance distance1 = 0;
        CLLocationDistance distance2 = 0;

        // create a CLLocation variable using the values from our MapLocation variable
        // in order to utilize the getDistanceFrom function
        CLLocation *user = [[CLLocation alloc] initWithLatitude:userLocationIn.coordinate.latitude longitude:userLocationIn.coordinate.longitude];
        CLLocation *closest = [[CLLocation alloc] initWithLatitude:closestLocationFound.coordinate.latitude longitude:closestLocationFound.coordinate.longitude];

        // create a variable to hold the values stores in the array
        // (this should be accessed directly from the array, but I'm not sure how to do it yet - CHANGE THIS)
        MapLocation *tempLoc = [[MapLocation alloc] init];
        tempLoc = [allLocations objectAtIndex:i];

        // create a CLLocation variable to hold the coordinates for each object in the array
        // (has to be CLLocation for the getDistance from function to work)
        CLLocation *check = [[CLLocation alloc] initWithLatitude:tempLoc.coordinate.latitude longitude:tempLoc.coordinate.longitude];

        // get the distance from the current closest location
        distance1 = [user getDistanceFrom:closest];
        // now get the distance from the next location in the array
        distance2 = [user getDistanceFrom:check];

        // if the location we just checked is closer than the location we're currently storing
        if(distance2 < distance1)
        {
            // declare that location the closest
            closestLocationFound = [allLocations objectAtIndex:i];
        }

        // clean up
        [user release];
        [tempLoc release];
        [check release];
        [closest release];
    }   
}

Я проверил свой код с помощью инструмента производительности Leaks, и он показывает, что мое приложение имеет только одну утечку (категория: MapLocation, eventType: Malloc, размер: 48, liabilityCaller :( ^ вышеуказанная функция)) Когда я дважды щелкаю по функции это приводит меня к этой линии.

distance1 = [user getDistanceFrom:closest];

Есть идеи или предложения? Заранее спасибо.

1 Ответ

3 голосов
/ 22 января 2011
MapLocation *tempLoc = [[MapLocation alloc] init];

Это линия. Вы выделяете / инициируете новый MapLocation, а затем сразу выбрасываете его

tempLoc = [allLocations objectAtIndex:i];

Когда эта строка выполняется, исходное значение tempLoc просачивается. Эта первая строка бесполезна, и они должны быть объединены в

MapLocation *tempLoc = [allLocations objectAtIndex:i];
...