0

基本的に、私の問題は、ループを介してUIViewの3つのインスタンスを作成しようとしていることです。私はARCを使用していますが、自分がやりたいことがARCで可能かどうかはよくわかりません。これが私が現在持っているコードです:

NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"RoomView"
                                                  owner:self
                                                options:nil];
NSMutableArray *roomViews = [[NSMutableArray alloc] initWithCapacity:[gtb.rooms count]];

for (i = 0; i < [gtb.rooms count]; i++)
{
    RoomView *rcv = [[RoomView alloc] init];
    NSDictionary *room = [gtb.rooms objectAtIndex:i];
    rcv = [nibViews objectAtIndex:0];
    NSLog(@"Start rcv = %@", rcv);
    rcv.roomNumber.text = [NSString stringWithFormat:@"Chambre %d", i + 1];
    rcv.roomType.text = [room objectForKey:@"roomType"];
    [rcv setFrame:CGRectMake(0, sizeOfContent, rcv.frame.size.width, rcv.frame.size.height)];
    sizeOfContent += rcv.frame.size.height;
    [roomViews addObject:rcv];
    NSLog(@"End rcv = %@", rcv);
}

for (i = 0; i < [gtb.rooms count]; i++)
    NSLog(@"Room #%i : %@", i, [roomViews objectAtIndex:i]);

そして、これが私がログに持っているものです:

2012-09-20 10:15:00.287 AppName[2792:707] Start rcv = <RoomView: 0x148570; frame = (0 0; 320 107); autoresize = W+H; layer = <CALayer: 0x148510>>
2012-09-20 10:15:00.289 AppName[2792:707] End rcv = <RoomView: 0x148570; frame = (0 420; 320 107); autoresize = W+H; layer = <CALayer: 0x148510>>
2012-09-20 10:15:00.312 AppName[2792:707] Start rcv = <RoomView: 0x148570; frame = (0 420; 320 107); autoresize = W+H; layer = <CALayer: 0x148510>>
2012-09-20 10:15:00.314 AppName[2792:707] End rcv = <RoomView: 0x148570; frame = (0 527; 320 107); autoresize = W+H; layer = <CALayer: 0x148510>>
2012-09-20 10:15:00.316 AppName[2792:707] Start rcv = <RoomView: 0x148570; frame = (0 527; 320 107); autoresize = W+H; layer = <CALayer: 0x148510>>
2012-09-20 10:15:00.317 AppName[2792:707] End rcv = <RoomView: 0x148570; frame = (0 634; 320 107); autoresize = W+H; layer = <CALayer: 0x148510>>
2012-09-20 10:15:00.319 AppName[2792:707] Room #0 : <RoomView: 0x148570; frame = (0 634; 320 107); autoresize = W+H; layer = <CALayer: 0x148510>>
2012-09-20 10:15:00.323 AppName[2792:707] Room #1 : <RoomView: 0x148570; frame = (0 634; 320 107); autoresize = W+H; layer = <CALayer: 0x148510>>
2012-09-20 10:15:00.325 AppName[2792:707] Room #2 : <RoomView: 0x148570; frame = (0 634; 320 107); autoresize = W+H; layer = <CALayer: 0x148510>>

[rcv autoRelease]ARCを使用していなかった場合は、ループの最後に配置する必要がありましたが、ARCでは使用できません。

それを解決するための解決策はありますか、またはこのファイルのARCを無効にする必要がありますか?

ご協力いただきありがとうございます !

4

3 に答える 3

1

ARCでは、自動リリースが求められています。あなたはそれについて心配する必要はありません。

于 2012-09-20T07:54:43.840 に答える
1

この行を置き換える必要があります:

rcv = [nibViews objectAtIndex:0];

これで:

rcv = [[nibViews objectAtIndex:0] copy];

そうでない場合は、同じビューオブジェクトにアクセスしているだけであり、そこからコピーされた新しいオブジェクトではないためです(強力な参照はコピーされていません)。

そして、副次的なこととして、その点でARCの影響はありません。ARCがなくても同じ問題が発生します。ARCでは、リリース/自動リリースなどを記述していません。

于 2012-09-20T08:29:29.270 に答える
0

メモリ管理のルールにより、割り当てたオブジェクトのみを解放する必要があります-初期化またはコピーします。ここでは、RoomView*rcvで両方を実行しているわけではありません。したがって、コードがそうである場合でも、not ARC enabledそれをリリースまたは自動リリースする必要はありません。

于 2012-09-20T07:59:13.423 に答える