开发者

[CFDictionary count]: message sent to deallocated instance

My app is calling the rqst_run method below in didViewLoad method but I've an error. Debugger reports the following error:

[CFDictionary count]: message sent to deallocated instance

and debug marker is placed on this line (in tableView numberOfRowsInSection method below):

if([self.listing_items count] > 0)

I don't know where this variable get released

Declared in header file (interface section):

NSMutableString        *rqst_error;
NSMutableData      *rqst_data;
NSMutableDictionary    *listing_items;

and I defined this method in implementation:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if([self.listing_items count] > 0)
    {
        if([self.listing_items objectForKey:@"items"])
        {
            return [[self.listing_items objectForKey:@"items"] count];
        }
    }
}

- (void)rqst_run
{
    rqst_data = [[NSMutableData data] retain];
    NSMutableURLRequest *http_request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.feedserver.com/request/"]];
    [http_request setHTTPMethod:@"POST"];
    NSString *post_data = [[NSString alloc] initwithFormat:@"param1=%@&param2=%@&param3=%@",rqst_param1,rqst_param2,rqst_param3];
    [http_request setHTTPBody:[post_data dataUsingEncoding:NSUTF8StringEncoding]];
    rqst_finished = NO;
    [post_data release];
    NSURLConnection *http_connection = [[NSURLConnection alloc] initWithRequest:http_request];
    [http_request release];

    if(http_connection)
    {
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];

        if([rqst_data length]>0)
        {
            NSString *rqst_data_str = [[NSString alloc] rqst_data encoding:NSUTF8StringEncoding];   
            SBJsonParser *json_parser = [[SBJsonParse alloc] init];
            id feed = [json开发者_如何学运维_parser objectWithString:rqst_data_str error:nil];
            listing_items = (NSMutableDictionary *)feed;
            [json_parser release];
            [rqst_data_str release];
        }   
        else
        {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Feed" message:@"No data returned" delegate:self cancemButtonTitle:@"Ok" otherButtonTitles:nil, nil];
            [alert show];
            [alert release];
        }
   }
   else
   {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Connection Problem" message:@"Connection to server failed" delegate:self cancemButtonTitle:@"Ok" otherButtonTitles:nil, nil];
        [alert show];
        [alert release];
   }
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    [rqst_data setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [rqst_data appendData:data];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    [rqst_data release];
    [connection release];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    [rqst_data release];
    [connection release];
    rqst_finished = YES;
}


NSMutableDictionary must be properly initialized before use. In your code you assign feed to listing_items and then release it. It haven't been retained so listing_items is also removed. Try to init dictionary like this:

listing_items = [[NSMutableDictionary alloc] initWithDictionary:feed];

and all should work fine.


Instead of this

listing_items = (NSMutableDictionary *)feed;

Use this

self.listing_items = [NSMutableDictionary dictionaryWithDictionary:feed];


It's pretty clear that: * You use the instance variable instead of the property to assign the value to listing_items * You put an autoreleased value in this ivar.

listing_items = (NSMutableDictionary *)feed; is clearly your error because feed is an autorleased variable (and then will be deallocated at the end of the current runloop by definition.

Either declare a @property(retain) for listing_items and use it each time you want to assign (autoreleased) value to it (so that the property will manage the retain/release on assignation)

Or retain the stored value manually (but this is painful as you need not to forget to release the previous value before assigning a new one to listing_items each time... which is what the setter method does when called either directly or thru the property assignment)


i think you need to initialize your NSMutableDictionary. Right now its just a pointer pointing to feed. when feed gets released, it just points to nil.

in the viewDidLoad : listing_items = [[NSMutableDictionary alloc] init];

or you need to retain the data: listing_items = [(NSMutableDictionary *)feed retain];


SBJsonParser *json_parser = [[SBJsonParse alloc] init];
id feed = [json_parser objectWithString:rqst_data_str error:nil];
listing_items = (NSMutableDictionary *)feed;
[json_parser release];

When you release the json_parser, the dictionary it holds is released too. So, as others said, you need to retain the dictionary obtained from json_parser.

0

上一篇:

下一篇:

精彩评论

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

最新问答

问答排行榜