2013-07-20 68 views
0

我目前正試圖解析來自Web服務的數據並將其格式化爲我的UITableView。關於該項目的當使用來自AFnetworking的JSON解析數據時,UITableView崩潰

詳細說明: 部署目標:IOS 4.3

jsonTapped功能:

-(void) jsonTapped 
{ 
    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://localhost"]]; 
    NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" 
                 path:@"" 
        parameters:@{@"provider":@"12", 
           @"var":@"titles"}]; 
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 
    [httpClient registerHTTPOperationClass:[AFHTTPRequestOperation class]]; 
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) 
{ 
    // Print the response body in text 
    NSLog(@"Response: %@", [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]); 
    NSString *str = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; 
    orderItems = [str objectFromJSONString]; 
    list = [orderItems objectAtIndex:0]; 
} 
failure:^(AFHTTPRequestOperation *operation, NSError *error) 
{ 
    NSLog(@"Error: %@", error); 
}]; 
[operation start]; 
} 

的有關資料中作爲字典的陣列。我已經檢查過課堂檢查功能。 列表是在.h文件中聲明的字典,而orderItems是在.h文件中聲明的NSArray。

當我去更新我的UITableView時,事情變得非常糟糕。如果我嘗試訪問列表中的一段數據(在我的jsonTapped功能之外的任何地方),整個事情就會崩潰。

我該如何解決這個問題?關於爲什麼我放入orderItems數組的信息不被保留的任何想法?

當它崩潰,它只是說(LLDB),然後引導我一個綠色的錯誤說編寫「主題1:EXC_BAD_ACCESS ......」

謝謝!

+1

你能發表您的崩潰細節? –

+0

在編輯中添加了它們。 – Lugubrious

回答

0

我看到你正在爲你的類變量分配一個自動釋放對象。如果你使用伊娃,你必須自己保留這些信息。使用可以聲明爲保留的屬性更容易。具體方法如下:

@interface MyClass { 

    NSArray *orderItems; 
    NSDictionary *list; 
} 

@end 

在您的.h變成:

@interface MyClass 

@property (nonatomic, retain) NSArray *orderItems; 
@property (nonatomic, retain) NSDictionary *list; 

@end 

在您.m文件,在您的jsonTapped方法:

orderItems = [str objectFromJSONString]; 
list = [orderItems objectAtIndex:0]; 

變爲:

self.orderItems = [str objectFromJSONString]; 
self.list = [orderedItems objectAtIndex:0]; 

你也可以這樣做:

orderItems = [[str objectFromJSONString] retain]; 
list = [[orderItems objectAtIndex:0] retain]; 

但是,你必須記住釋放他們的地方,否則你就會有內存泄漏。

對於物業來說,就像將它們設置爲nil一樣簡單。編譯器會在必要時知道釋放該對象。

這是你的dealloc方法應該是什麼樣子:

- (void)dealloc { 

    self.orderItems = nil; 
    self.list = nil; 

    ... 

    [super dealloc]; 
}