2012-09-20 42 views
0

基本上,我的問題是,我試圖通過循環創建UIView的3個實例。我正在使用ARC,而且我真的不知道我想要做什麼是可能的。下面的代碼我目前有:IOS - 通過循環創建新的對象實例與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?

感謝您的幫助!

+0

我沒有看到你在循環中創建任何UIView的實例。當你調用'loadNibNamed:'時顯然創建了這些實例。他們只是從'nibViews'傳遞到'roomViews'。 – ThomasW

+0

我編輯了我的帖子。但是,似乎當我將該對象添加到我的數組中時,所有對象都將使用最後一個對象的屬性。 –

+0

哦,那是因爲你正在調用'[nibViews objectAtIndex:0]'而不是'[nibViews objectAtIndex:i]'。 – ThomasW

回答

1

您需要替換這一行:

rcv = [nibViews objectAtIndex:0]; 

有了這一個:

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

因爲如果沒有,你只是訪問相同的視圖對象,而不是一個新的從它複製(強烈的參考不被複制)。

而且,作爲一個方面,在這個問題上沒有ARC的影響。沒有ARC你會有同樣的問題。用ARC你只是沒有寫發佈/ autorelease等

+0

得到此錯誤:'***由於未捕獲的異常終止應用程序'NSInvalidArgumentException',原因:' - [RoomView copyWithZone:]:無法識別的選擇器發送到實例0x24b1c0'' –

+0

我的錯誤,UIViews可能不會實現複製方法。您應該在您的自定義類中覆蓋它,以複製您感興趣的值。另一種(低效率)方法是每次在循環中加載nib,調用[[[NSBundle mainBundle] loadNibNamed:@「RoomView」)owner:self options:nil] objectAtIndex:0] – DarthMike

+0

這種低效率的方式適用於我的情況。你爲什麼稱它效率低下? –

1

隨着ARC,autorelease正在爲你調用。你不需要擔心它。

0

通過內存管理的規則,您只需要釋放您分配的對象(init或copy)。在這裏,你不能同時使用RoomView * rcv。 因此,即使您的代碼是not ARC enabled,您也不需要釋放或自動釋放它。