NSMutableArray没有将值传递给CellForRowAtIndexPath?

时间:2011-04-18 07:32:18

标签: iphone objective-c ios ios4

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

Search.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

3 个答案:

答案 0 :(得分:3)

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

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

您需要确保在创建阵列时保留阵列(并在完成后释放它)。

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

- (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"]];
    ...
}

答案 1 :(得分:1)

NSMutableArray arrayWithArray:已自动释放。你需要保留它。

答案 2 :(得分:1)

您需要保留NSMutable数组,尝试为数组创建属性。

将以下内容添加到.h文件

@property (nonatomic, retain) NSMutableArray *jsonKanji;

然后@synthesize .m文件中的jsonKanji。 并将数组的加载更改为:

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