2

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 を使用します。

私のアプリには、tableView1、tableView2、tableView3 の 3 つの tableview インスタンス変数があります。そして 3 つのラベル インスタンス変数。次のようなコントローラー (呼び出し元) 呼び出しを表示します。

   [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 対応です。

4

1 に答える 1

2

違う。パラメータには、参照ではなく値で渡すため、実際には割り当て/初期化されたインスタンスは含まれません。オブジェクトにポインターを渡し、新しいインスタンスを割り当てるときに逆参照することを検討してください。

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

次のように呼び出します。

UITableView *tv;
[self createTableView:&tv];
于 2012-04-19T15:37:56.757 に答える