UITableview在numberOfRowsInSection崩溃; Json在NSDictionary中向UITableview

时间:2011-11-23 09:51:48

标签: json uitableview nsdictionary crash

我已将json与JSONKit从url获取到initWithNibName中的NSDictionary

    NSData *jsonData = [NSData dataWithContentsOfURL:[NSURL URLWithString:jsonUrl]];
    JSONDecoder *jsonKitDecoder = [JSONDecoder decoder];
    jsonDic = [jsonKitDecoder parseJSONData:jsonData];    // NSDictionary *jsonDic
    NSLog(@"Json Dictionary Fetched %@", jsonDic); // Display the Json fine :-)
    NSLog(@"Dictionary Count %i", [jsonDic count]); // Display the Dic count fine :-)
    array = [jsonDic objectForKey:@"courses"];    // NSArray *array
    NSLog(@"Courses Found %@", array); // Display the array fine :-)
    NSLog(@"Courses Count %i", [array count]);

这是Json

    { "name":"Name 1" , "courses": [
        { "title":"Course 1" , "desc":"This is course 1" }, 
        { "title":"Course 2" , "desc":"This is course 2" }, 
        { "title":"Course 3" , "desc":"This is course 3" }  ]
    }

我将一个tableview拖到了xib。将IBOutlet UITableview tblView设置为Interface Builder上的Connectionsview,以及tableview dataSource和委托给FilesOwner

手动将tableview事件添加为

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        return 1;
    }
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        int cnt = [array count];    // CRASHES HERE Remeber returning 1; still why ?
        return 1;
    }
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {     
        static NSString *CellIdentifier = @"Cell";   
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
        }
        int indx = [indexPath indexAtPosition:1];
        /* THESE ARE ALL COMMENTED
        NSString *key = [[jsonDic allKeys] objectAtIndex:indx];
        NSString *value = [jsonDic objectForKey:key];
        cell.textLabel.text = value;
        /* / THESE ARE ALL COMMENTED
        NSDictionary *eachItem = [array objectAtIndex:indx];
        cell.textLabel.text = [eachItem objectForKey:@"title"];
        // */
        cell.textLabel.text = @"My Title"];
        return cell;
    }

有人请帮我解决这个问题。我需要在tableview上显示课程。

1 个答案:

答案 0 :(得分:0)

如果您向其发送消息(此处为count),则可能会释放您的数组对象导致崩溃(EXEC_BAD_ACCESS?)。从行

array = [jsonDic objectForKey:@"courses"];    // NSArray *array

似乎它是自动释放的,你应该保留它。

编辑:

您可以通过以下方式保留它:

将其设置为保留属性

@property(nonatomic, retain) NSArray* array;

并使用访问者

self.array = [jsonDic objectForKey:@"courses"]; 

自动释放旧值并保留新值。或者明确地保留它

array = [[jsonDic objectForKey:@"courses"] retain];

然后你一定不要忘记在完成后释放它,否则你会泄漏内存。您应该阅读Advanced Memory Management Programming Guide,它会给您一个详尽的解释,了解基本技术至关重要。