2012-09-20 4 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

내 게시물을 편집했습니다. 그러나 객체를 Array에 추가하면 모든 객체가 마지막 객체의 속성을 사용하는 것처럼 보입니다. –

+0

오, 그건 [nibViews objectAtIndex : i] 대신'[nibViews objectAtIndex : 0]'을 호출하기 때문입니다. – ThomasW

답변

1

는이 라인을 교체해야

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

하지 않을 경우, 당신은 단지 동일한 뷰 객체가 아니라 그것에서 복사 된 새 (액세스 때문에 강력한 참조가 복사되지 않음).

측면으로는 ARC의 영향이 없습니다. ARC가 없으면 같은 문제가 발생합니다. ARC를 사용하면 릴리스/자동 해제 등을 작성하지 않고 있습니다.

+0

이 오류가 발생했습니다 :'*** 캐치되지 않은 예외로 인해 앱 종료 중 'NSInvalidArgumentException', 이유 : '- [RoomView copyWithZone :] : 인식 할 수없는 선택기가 인스턴스 0x24b1c0에 전송되었습니다. –

+0

실수로 UIView가 복사 방법을 구현하지 못할 수 있습니다.관심이있는 값을 복사하려면 사용자 정의 클래스에서 재정의해야합니다. 또 다른 (비효율적 인) 방법은 루프 내에서 매번 nib를로드하고 [[[NSBundle mainBundle] loadNibNamed : @ "RoomView"를 호출하는 것입니다. 소유자 : 자기 옵션 : 없음] objectAtIndex : 0] – DarthMike

+0

이 비효율적 인 방법은 내 경우에 작동합니다. 왜 비효율적이라고합니까? –

1

ARC를 사용하면 자동 릴리스가 호출됩니다. 그것에 대해 걱정할 필요가 없습니다.

0

메모리 관리 규칙에 따라 할당 한 객체 (init 또는 copy) 만 릴리스해야합니다. 여기에서는 RoomView * rcv를 사용하지 않습니다. 코드가 not ARC enabled 인 경우에도 릴리스하거나 자동 출시하지 않아도됩니다. 이것으로

rcv = [nibViews objectAtIndex:0]; 

:

관련 문제