开发者

Setting NSDictionary object as a property in child view either leaks when not released or gives EXC_BAD_ACCESS error when released

I have the following problem: In a certain view controller I have a NSDictionary, which itself is an entree in an NSArray object. This view controller has a child view which displays some of the key value pairs that are in this dictionary. Since I need only some key value pairs, I construct a new dictionary object from which I then remove the key value pair I do not want to have in it. To be able to access this dictionary in the child view, I though it would be possible to just set the dictionary via a property, which seems to work fine. To illustrate with some code:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    ...

    // today is an instance of NSArray holding a number o开发者_Go百科f NSDictionary objects
    NSDictionary *completeData = [self.today objectAtIndex:row];
    NSDictionary *data = [[NSDictionary alloc] initWithDictionary:completeData];
    [data removeObjectForKey:@"name"];

    SomeViewController *childController = [[SomeViewController alloc] init];
    childController.data = data;

    [self.navigationController pushViewController:childController animated:YES];
    [childController release];

    // This results in a EXC_BAD_ACCESS error when navigating back to the parent 
    // view and calling didSelectRowAtIndexPath a second time. When commenting this 
    // line out, the error dissapears, but now the object leaks
    [data release];
}

The problem arises when, after returning to the parent view, I try to replace the NSArray object (today) by an updated version of itself by calling

- (void)refreshDataNotification:(NSNotification *)notification {
    if (notification) {
        self.today = [NSArray arrayWithArray:[[[MyAppDelegate getAppDelegate] todaySchedule]  
            objectForKey:@"data"]];
        [self.tableView reloadData];
    }
} 

Note that as long as I do not release 'data' in didSelectRowAtIndexPath I get no error, but then the object leaks. When I do release it, I receive an EXC_BAD_ACCESS when refreshDataNotification is executed.

If someone has any clue as to what I might be doing wrong, then please do share with me.


Set the environment variable NSZombieEnabled to YES to get more helpful error messages about over releasing objects. (Set the environment variable by viewing details under 'Executables')

Also, it would be helpful to see how you've defined your properties. (e.g. what is the @property for data in SomeViewController?)

ps - I know you haven't pasted actual code, but data is a terrible instance name for an NSDictionary. dict is better - but something more descriptive would make your code easier to understand.

0

上一篇:

下一篇:

精彩评论

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

最新问答

问答排行榜