iphone - IOS - 通过使用 ARC 的循环创建新的对象实例

标签 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?

感谢您的帮助!

最佳答案

你需要替换这一行:

rcv = [nibViews objectAtIndex:0];

有了这个:

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

因为如果没有,您只是在访问同一个 View 对象,而不是从它复制的新 View 对象(未复制强引用)。

另一方面,ARC 在这件事上没有影响。如果没有 ARC,你会遇到同样的问题。使用 ARC,您只是不用编写发布/自动发布等。

关于iphone - IOS - 通过使用 ARC 的循环创建新的对象实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12507995/

相关文章:

iphone - 触摸透明 PNG

ios - 如何在iOS的对象库中使用 "pdfView"?

objective-c - 查找文件大小

ios - 如何在编辑文本字段时禁用手势识别器?

ios - 如何实现让 UITableView 设置其单元格的插图而不在整个表格上设置插图?

iphone - 如何让我的事件指示器 View 覆盖所有屏幕?

ios - Realm 是否支持 iOS 中的 LIMIT 查询?

objective-c - 在 iOS 中实现一个简单的折线图

objective-c - 带有 Cordova 的 OSX 上的圆形 WebView?

iphone - 在不适用于 iPhone 5.1 (XCode 4.3.2) 的 View 之间切换