正确填充数组后,当我使用tableview reload再次调用它时,第一次(在clean之后)返回一个空值,然后执行后返回EXC_BAD_ACCES。试图提供所需的所有代码......感谢您的帮助!
在.h文件中:
@interface userViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {
NSArray *appData;
IBOutlet UIActivityIndicatorView *activityIndicator;
IBOutlet UILabel *status;
IBOutlet UITableView *mainTable;
IBOutlet UIBarButtonItem *refresh;
}
@property (nonatomic, retain) UIActivityIndicatorView *activityIndicator;
@property (nonatomic, retain) UILabel *status;
@property (nonatomic, retain) UITableView *mainTable;
@property (nonatomic, retain) UIBarButtonItem *refresh;
@property (nonatomic, retain) NSArray *appData;
- (IBAction) refresca: (id)sender;
<。>在.m文件中,当执行requestFinished函数时,appData已正确填充。
- (void)requestFinished:(ASIHTTPRequest *)request {
NSLog(@"%@", [request responseString]);
[activityIndicator stopAnimating];
activityIndicator.hidden = YES;
appData = [[request responseString] componentsSeparatedByString: @"#"];
int x =0;
while (x<[appData count] - 1)
{
NSLog(@"Data = %@",[appData objectAtIndex: x]);
x = x+1;
}
}
然而,在执行之后,当重新加载tableview时,appData似乎是空的并且之前的conted已被删除!!
2011-10-13 18:10:43.682 Nimbo[444:207] Data = <UITableViewCellContentView: 0x5c93dd0; frame = (0 0; 320 43); layer = <CALayer: 0x5c953b0>
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView setFrame:CGRectMake(0, 44, 320, 412)];
static NSString* cellIdentifier = @"cellIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if(cell == nil)
{
cell = (UITableViewCell*) [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
}
cell.accessoryType = UITableViewCellAccessoryNone;
cell.textLabel.backgroundColor = [UIColor clearColor];
int x = 0;
if ([appData count] != 0)
{
NSLog(@"Data = %@",[appData objectAtIndex: 0]);
}
return cell;
}
答案 0 :(得分:2)
看起来您的实例变量appData
未被保留。
appData
以及先前在那里分配的对象。
尝试更改:
appData = [[request responseString] componentsSeparatedByString: @"#"];
为:
self.appData = [[request responseString] componentsSeparatedByString: @"#"];
答案 1 :(得分:1)
你的问题主要在这里
appData = [[request responseString] componentsSeparatedByString: @"#"];
您正在将自动释放的对象分配给appData
,这不是正确的方式,因为您没有取得所有权。您也没有释放以前持有的数据的所有权。您应该使用appData
。
self.appData = [[request responseString] componentsSeparatedByString: @"#"];
应该修复它。
答案 2 :(得分:0)
您应该使用属性(self.appData
):
self.appData = [[request responseString] componentsSeparatedByString: @"#"];
答案 3 :(得分:0)
不知道这是不是问题,很可能不是......但是为什么在你不使用self.appData时定义一个属性?你是@synthesize appData吗?
当您使用属性时,调用self.property实际上会调用生成的setter和getter,并且这些属性在属性上指定。因此,如果您使用retain指定一个属性,但是为变量本身指定了一个方便返回的数组,则在事件循环之后,便捷数组将自动释放,并且因为您没有保留该数组,它将从内存中删除,丢失所有内容你曾经在那里,以及在你的情况下可能发生的事情。