我可以将值放入数组,这是我的代码和问题。

搜索.h

@interface SearchKeyword : UIViewController {
    UITableView * newsTable;
    UILabel * waitLabel;
    UIActivityIndicatorView *activityIndicator;
    UIView * backView;

    NSMutableArray *jsonKanji;
}

@property (nonatomic, retain) IBOutlet UITableView * newsTable;
@property (nonatomic, retain) IBOutlet UILabel * waitLabel;
@property (nonatomic, retain) IBOutlet UIActivityIndicatorView * activityIndicator;
@property (nonatomic, retain) IBOutlet UIView * backView;

- (UITableViewCell *) getCellContentView:(NSString *)cellIdentifier;

@end


这是Search.m

- (void)viewDidAppear:(BOOL)animated{
...
jsonKanji = [NSMutableArray arrayWithArray:(NSArray *)[jsonDict valueForKey:@"kanji_name"]];
...
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSLog(@"jsonkanji 0 %@",[jsonKanji objectAtIndex:0]);
    return [jsonKanji count];
}


这是正确的结果“ jsonkanji 0 Japan”,如果我更改objAtindex = 1它也显示正确的“ jsonkanji 1 England”。

但是当我去这个

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"jsonkanji 0 %@",[jsonKanji objectAtIndex:1]);
    ...
    return cell;
}


崩溃了!请帮我解释一下会发生什么?并且它仅显示“EXC_BAD_ACCESS”@main.m

最佳答案

您有内存管理问题。根据Apple的内存管理指南,[NSMutableArray arrayWithArray:]为您提供一个自动释放的对象。

在您的第一个测试中,您正在检查对象取消分配之前的某个时刻的值。到表视图的委托调用到达时,该对象已被取消分配,并且内存不再存在。

您需要确保在创建数组时保留该数组(并在完成数组后将其释放)。

您可以明确地执行此操作:

- (void)viewDidAppear:(BOOL)animated{
    ...
    jsonKanji = [[NSMutableArray arrayWithArray:(NSArray *)[jsonDict valueForKey:@"kanji_name"]] retain];
    ...
}


或创建一个属性并使用该属性分配值,该属性将自行处理保留:
(接口)

@interface SearchKeyword : UIViewController {
....
@property (nonatomic, retain) INSMutableArray *jsonKanji;
...
@end


(实现)

- (void)viewDidAppear:(BOOL)animated{
    ...
    self.jsonKanji = [NSMutableArray arrayWithArray:(NSArray *)[jsonDict valueForKey:@"kanji_name"]];
    ...
}

10-08 05:23