通过引用(指针)与iOS对象冲突?

时间:2012-04-19 15:18:48

标签: ios

我的视图中有很少的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。

1 个答案:

答案 0 :(得分:2)

错误。参数实际上不包含已分配/初始化的实例,因为您按值传递它们,而不是通过引用传递它们。在分配新实例时,请考虑将指针传递给对象,然后取消引用它:

- (void)createTableView:(UITableView **)tvPtr
{
    *tvPtr = [[UITableView alloc] init...];
    // etc.
}

这样打电话:

UITableView *tv;
[self createTableView:&tv];