开发者

Leak with Mutable Array even when released

开发者 https://www.devze.com 2023-01-26 17:15 出处:网络
Instruments point to this line saying there is a leak here - (void) loadFavoriteData { TradePortMobileAppDelegate *delegate = [[UIApplication sharedApplication] delegate];

Instruments point to this line saying there is a leak here

- (void) loadFavoriteData {
    TradePortMobileAppDelegate *delegate = [[UIApplication sharedApplication] delegate];

    NSManagedObjectContext *context = [delegate managedObjectContext];

    NSManagedObjectModel *objectModel = [[con开发者_Go百科text persistentStoreCoordinator] managedObjectModel];

    Session *session = delegate.session;

    NSDictionary *param = [NSDictionary dictionaryWithObjectsAndKeys: [session objectForKey:@"CTY_CODE"], pCOUNTRY, nil];

    NSFetchRequest *fetchRequest = [objectModel fetchRequestFromTemplateWithName:@"fetchAllFavorites" substitutionVariables:param];

    [fetchRequest setSortDescriptors: self.dataSorter];
    NSError *error;

    //THIS IS THE LINE INSTRUMENT SAYS THERE IS A LEAK!!!!!
    NSMutableArray *favorites = [[context executeFetchRequest:fetchRequest error:&error] mutableCopy];


    if ([favorites count] > 0) {

        [self.favoriteList removeAllObjects];


        for (NSInteger i=0; i < [favorites count]; i++) {
            FavoriteData *favorite = [favorites objectAtIndex: i];

            if (i < vMaxRecordsInCoreData) {

                [self.favoriteList addObject:[FavoriteInfo favoriteInfoWithClientId:favorite.clientId               withName:favorite.name 
                withAddress:favorite.address 
                withPhone:favorite.phone 

    withEmail:favorite.email 

    withCountry:favorite.country 

    withLtpId:favorite.ltpId
                withUpdateTimestamp:favorite.updateTimestamp
                withNoOfDetails:favorite.noOfDetails]];

    }

    else {

    [context deleteObject:favorite];

    }

        }

        if (![context save:&error]) {
            NSLog(@"deleting excess favorites failed.");
        }
        self.navigationItem.leftBarButtonItem.enabled = YES;

    }
    else {
        [self.favoriteList removeAllObjects];
        self.navigationItem.leftBarButtonItem.enabled = NO;
    }

    [favorites removeAllObjects];
    [favorites release];

}

This is the stack

   0 CoreFoundation _CFRuntimeCreateInstance
   1 CoreFoundation __CFStringCreateImmutableFunnel3
   2 CoreFoundation CFStringCreateWithCString
   3 CoreData -[NSSQLCore _prepareResultsFromResultSet:usingFetchPlan:withMatchingRows:]
   4 CoreData -[NSSQLCore _newRowsForFetchPlan:selectedBy:withArgument:]
   5 CoreData -[NSSQLCore newRowsForFetchPlan:]
   6 CoreData -[NSSQLCore objectsForFetchRequest:inContext:]
   7 CoreData -[NSSQLCore executeRequest:withContext:error:]
   8 CoreData -[NSPersistentStoreCoordinator executeRequest:withContext:error:]
   9 CoreData -[NSManagedObjectContext executeFetchRequest:error:]
  MY CODE HERE--->10 TradePortMobile -[FavoritesTableViewController loadFavoriteData] /Users/aldrich/Projects/iPhone/Classes/FavoritesTableViewController.m:281
  11 TradePortMobile -[FavoritesTableViewController viewWillAppear:] /Users/aldrich/Projects/iPhone/Classes/FavoritesTableViewController.m:54
  12 UIKit -[UINavigationController viewWillAppear:]
  13 UIKit -[UITabBarController transitionFromViewController:toViewController:transition:shouldSetSelected:]
  14 UIKit -[UITabBarController transitionFromViewController:toViewController:]
  15 UIKit -[UITabBarController _setSelectedViewController:]
  16 UIKit -[UITabBarController _tabBarItemClicked:]
  17 UIKit -[UIApplication sendAction:to:from:forEvent:]
  18 UIKit -[UITabBar _sendAction:withEvent:]
  19 UIKit -[UIApplication sendAction:to:from:forEvent:]
  20 UIKit -[UIControl sendAction:to:forEvent:]
  21 UIKit -[UIControl(Internal) _sendActionsForEvents:withEvent:]
  22 UIKit -[UIControl sendActionsForControlEvents:]
  23 UIKit -[UIApplication sendAction:to:from:forEvent:]
  24 UIKit -[UIControl sendAction:to:forEvent:]
  25 UIKit -[UIControl(Internal) _sendActionsForEvents:withEvent:]
  26 UIKit -[UIControl touchesEnded:withEvent:]
  27 UIKit -[UIWindow _sendTouchesForEvent:]
  28 UIKit -[UIApplication sendEvent:]
  29 UIKit _UIApplicationHandleEvent
  30 GraphicsServices PurpleEventCallback
  31 CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__
  32 CoreFoundation __CFRunLoopDoSource1
  33 CoreFoundation __CFRunLoopRun
  34 CoreFoundation CFRunLoopRunSpecific
  35 CoreFoundation CFRunLoopRunInMode
  36 GraphicsServices GSEventRunModal
  37 GraphicsServices GSEventRun
  38 UIKit UIApplicationMain
  39 TradePortMobile main /Users/aldrich/Projects/iPhone/main.m:14
  40 TradePortMobile start

May somebody give me a push to the right direction? or an answer to this leak i can not solve :)


The leak tool can only point to where the memory has been allocated, the leak is probably happening as you are passing some of the properties of each object from the array in the following code:

[self.favoriteList addObject:[FavoriteInfo favoriteInfoWithClientId:favorite.clientId               withName:favorite.name 
                withAddress:favorite.address 
                withPhone:favorite.phone 

    withEmail:favorite.email 

    withCountry:favorite.country 

    withLtpId:favorite.ltpId
                withUpdateTimestamp:favorite.updateTimestamp
                withNoOfDetails:favorite.noOfDetails]];

you need to check what happens with the parameters of favoriteInfoWithClientId:favorite - if you retain any of these then you will have a leak...

hope this helps

0

精彩评论

暂无评论...
验证码 换一张
取 消