Hyder
Hyder

Reputation: 1173

Xcode Memory Debugger showing instances of already removed objects - iOS

Please see attached image for reference. All of the viewControllers have been already removed from the app but Memory Debugger shows its instances as well as all its properties. When i click the Show Only Leaked blocks filter of Memory Debugger, the viewControllers and other instances do not appear in it. Does it mean there are no leaks?

How do I solve the problem. What does it mean?

enter image description here

I do have the PKYStepper block in the CartViewController's cellForRowAtIndexPath (Stepper is a UIControl in my TableViewCell) method as follows :

PKYStepper *qtyStepper = [cell viewWithTag:993];

qtyStepper.tappedCallback = ^(PKYStepper *stepper) {

            NSLog(@"Tapped!");

            rowSelected = indexPath;

            if (((Dish*)((MenuSubSection*)_section.subSections[0]).dishesArray[indexPath.row]).disheOptions.count)
            {
                UIWindow *window = [UIApplication sharedApplication].keyWindow;

                NSBundle* bun = [NSBundle bundleWithIdentifier:@"com.test.test"];

                DishItemOption *dishOptions = [[bun loadNibNamed:@"DishItemOption" owner:self options:nil] objectAtIndex:0];
                dishOptions.frame = CGRectMake(0, 0, window.frame.size.width, window.frame.size.height);

                dishOptions.dish = [[Dish alloc] initWithDishObject:((Dish*)((MenuSubSection*)_section.subSections[0]).dishesArray[indexPath.row])];
                dishOptions.delegate = self;
                [window addSubview:dishOptions];
            }

        };

How to make it reference the Weak Self?

Upvotes: 0

Views: 139

Answers (2)

Hyder
Hyder

Reputation: 1173

Found the solution. Updated my callbacks to the following :

__weak typeof(self) weakSelf = self;

    qtyStepper.incrementCallback = ^(PKYStepper *stepper, float newValue) {

        CartViewController *sSelf = weakSelf;

        [sSelf updateTotalCharges]; //Had to use WEAKSELF in the callback!

    };

Upvotes: 1

bbum
bbum

Reputation: 162722

It looks like you've likely captured the view controller in a callback block of some sort.

Specifically, PKYStepper seems to have a callback block that is strongly referencing the view controller. Either make sure said reference is weak or make sure the block is properly destroyed when the view controller is torn down.

Upvotes: 3

Related Questions