IOS - 通过ARC循环创建新对象实例

时间:2012-09-20 07:36:42

标签: iphone objective-c ios automatic-ref-counting instance

基本上,我的问题是我试图通过循环创建3个UIView实例。我正在使用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>>

我知道如果我没有使用ARC,我应该在循环结束时放置类似[rcv autoRelease]的东西,但是使用ARC,我不能。

有没有解决方法,或者我必须为此文件禁用ARC吗?

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

使用ARC,正在为您调用自动释放。你不必担心它。

答案 1 :(得分:1)

您需要替换此行:

rcv = [nibViews objectAtIndex:0];

有了这个:

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

因为如果没有,您只是访问相同的视图对象,而不是从中复制的新对象(强引用未复制)。

而作为一方,没有,ARC在这件事上没有影响力。没有ARC你会遇到同样的问题。使用ARC,您只是不写发布/自动释放等。

答案 2 :(得分:0)

根据内存管理规则,您只需要释放alloc-init或copy的对象。在这里,你没有使用RoomView * rcv。 因此,即使您的代码为not ARC enabled,也无需发布或自动发布。

相关问题