我有一个应用程序,我在viewDidLoad中加载数据如下
dispatch_queue_t concurrentQueue = dispatch_queue_create("MyQueue", NULL);
dispatch_async(concurrentQueue, ^{
[self loadProfile];
dispatch_async(dispatch_get_main_queue(), ^{
[tblViewProfile reloadData];
});
});
应用程序在创建单元格并为自定义UITableViewCell中的标签控件设置数据后崩溃,代码如下
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if(indexPath.row == 0)
{
static NSString *simpleTableIdentifier = @"ProfileViewCell";
ProfileViewCell *cell = (ProfileViewCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil)
{
NSArray * customcellArray = [[NSBundle mainBundle]loadNibNamed:@"ProfileViewCell" owner:self options:nil];
for(id customcellObject in customcellArray){
if([customcellObject isKindOfClass: [UITableViewCell class]]){
cell = (ProfileViewCell *)customcellObject;
break;
}
}
}
cell.lblFollowers.text = strFollowers;
cell.lblFollowing.text = strFollowing;
cell.lblName.text = strName;
cell.lblOOTD.text = strOOTD;
return cell;
}
else
{
static NSString *simpleTableIdentifier = @"PostViewCell";
PostViewCell *cell = (PostViewCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil)
{
NSArray * customcellArray = [[NSBundle mainBundle]loadNibNamed:@"PostViewCell" owner:self options:nil];
for(id customcellObject in customcellArray){
if([customcellObject isKindOfClass: [UITableViewCell class]]){
cell = (PostViewCell *)customcellObject;
break;
}
}
}
return cell;
}
}
当我在这里为小区成员设置数据时
cell.lblFollowers.text = strFollowers;
cell.lblFollowing.text = strFollowing;
cell.lblName.text = strName;
cell.lblOOTD.text = strOOTD;
上面的第一行崩溃了应用程序错误的访问错误。如果我删除该行下一行导致相同的崩溃,我没有得到这次崩溃的原因。
请帮忙
修改 的 做了一些测试,然后发现Bad Exec是由引起的 strFollowing,strFollowers等但我已经初步确定了他们不知道在哪里以及为什么他们会被解除分配。
答案 0 :(得分:1)
您可以创建一个Utility方法来从NibName
获取Class实例+ (id)loadNibNamed:(NSString *)nibName ofClass:(Class)objClass
{
if (nibName && objClass)
{
NSArray *objects = [[NSBundle mainBundle] loadNibNamed:nibName
owner:nil
options:nil];
for (id currentObject in objects )
{
if ([currentObject isKindOfClass:objClass])
return currentObject;
}
}
return nil;
}
在您的代码中使用此功能,例如
ProfileViewCell *cell = (ProfileViewCell *)[tableView dequeueReusableCellWithIdentifier:@"ProfileViewCell"];
if (cell == nil)
{
cell = [Utility loadNibNamed:@"ProfileViewCell" ofClass:[ProfileViewCell class]];
}
PostViewCell *cell = (PostViewCell *)[tableView dequeueReusableCellWithIdentifier:@"PostViewCell"];
if (cell == nil)
{
cell = [Utility loadNibNamed:@"PostViewCell" ofClass:[PostViewCell class]];
}
希望这会对你有帮助。
答案 1 :(得分:0)
我弄清楚了我的错误或缺乏知识,
在将变量声明为属性时,需要使用' self'关键字以便调用setter方法,然后只保留变量,否则释放它,因为我没有使用self关键字来访问这些变量,它们被释放并导致访问不良。
我希望这有助于其他人。