我可以将值放入数组,这是我的代码和问题。
搜索.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"]];
...
}