[CFDictionary count]:发送到解除分配实例的消息

时间:2011-09-06 08:47:43

标签: iphone ios uitableview ios4

我的应用在 didViewLoad 方法中调用了 rqst_run 方法,但我发现了一个错误。调试器报告以下错误:

[CFDictionary count]: message sent to deallocated instance

和调试标记放在这一行上(在下面的tableView numberOfRowsInSection方法中):

if([self.listing_items count] > 0)

我不知道这个变量的释放位置

在头文件(接口部分)中声明:

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

我在实现中定义了这个方法:

- (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;
}

5 个答案:

答案 0 :(得分:3)

NSMutableDictionary必须在使用前正确初始化。在您的代码中,您将feed分配给listing_items,然后将其释放。它尚未保留,因此也删除了listing_items。 尝试像这样初始化字典:

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

一切都应该正常。

答案 1 :(得分:1)

而不是这个

listing_items = (NSMutableDictionary *)feed;

使用此

self.listing_items = [NSMutableDictionary dictionaryWithDictionary:feed];

答案 2 :(得分:0)

很明显:  *您使用实例变量而不是属性将值赋给listing_items  *你在这个ivar中放了一个自动释放的值。

listing_items = (NSMutableDictionary *)feed;显然是您的错误,因为feed是一个自动发布的变量(然后根据定义在当前的runloop末尾取消分配。

@property(retain)声明listing_items并在每次要为其分配(自动释放)值时使用它(以便属性在分配时管理保留/释放)

或手动保留存储的值(但这很痛苦,因为您不必忘记在每次向listing_items分配新值之前释放先前的值...这就是setter方法在调用时所执行的操作直接或通过财产分配)

答案 3 :(得分:0)

我认为你需要初始化你的NSMutableDictionary。现在它只是一个指向feed的指针。当饲料被释放时,它只指向零。

viewDidLoad中的

: listing_items = [[NSMutableDictionary alloc] init];

或者您需要保留数据: listing_items = [(NSMutableDictionary *)feed retain];

答案 4 :(得分:0)

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

当您释放json_parser时,它所拥有的词典也会被释放。 因此,正如其他人所说,您需要保留从json_parser获得的字典。