我的视图中有很少的UITableView / s和UILabel / s。我正在以编程方式创建它们(即不使用NIB)。
我在一个带签名的方法中整合了tableView和标签创建:
- (void) CreateTableView:(UITableView*) outTableView andLabel:(UILabel*)OutLabel AtFrame:(CGRect) frame{
CGRect labelFrame = frame;
labelFrame.origin.x = LABEL_LEFT_ALIGNMENT;
labelFrame.origin.y -= LABEL_TOP_ALIGNMENT;
labelFrame.size.height = LABEL_HEIGHT;
outLabel = [[UILabel alloc] initWithFrame:labelFrame];
[[self view] addSubview:outLabel];
outTableView = [[UITableView alloc] initWithFrame:frame style:UITableViewStyleGrouped];
[outTableView setDataSource:self];
[outTableView setDelegate:self];
[[self view] addSubview:outTableView];
}
这里,outTableView和outLabel是输出参数。也就是说,在完成方法之后,调用者将使用outTableView和outLabel。
我的应用有3个tableview实例变量 - tableView1,tableView2,tableView3。还有三个标签实例变量。查看控制器(调用者)调用如:
[self CreateTableView:tableView1 andLabel:label1 AtFrame:frame1];
[self CreateTableView:tableView2 andLabel:label2 AtFrame:frame2];
[self CreateTableView:tableView3 andLabel:label3 AtFrame:frame3];
完成此方法后,UILabel *将在屏幕上呈现,调用者可以使用UILabel *对象。奇怪的是,UITableView *对象的情况并非如此。
任何想法,为什么会有不同的行为?
注意:我的应用程序已启用ARC。
答案 0 :(得分:2)
错误。参数实际上不包含已分配/初始化的实例,因为您按值传递它们,而不是通过引用传递它们。在分配新实例时,请考虑将指针传递给对象,然后取消引用它:
- (void)createTableView:(UITableView **)tvPtr
{
*tvPtr = [[UITableView alloc] init...];
// etc.
}
这样打电话:
UITableView *tv;
[self createTableView:&tv];