我的应用在 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=%@¶m2=%@¶m3=%@",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;
}
答案 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
获得的字典。