문제

NSARRAY가 있고 요소를 평가하고 변경하려면 루프 내부에서 배열을 변경할 수 없습니다. 따라서, 당신은 그것을 돌연변이 가능한 사본을 만듭니다 ~할 수 있다 변경됩니다.

code example:

NSMutableArray *bin = [NSMutableArray arrayWithObjects:@"0", @"1", @"2", @"3", @"4", @"5", @"6", @"7", nil];
NSMutableArray *list = [NSMutableArray arrayWithObjects:@"a1", @"b2", @"c3", @"e4", nil];

NSMutableArray *listHolder = list; // can't mutate 'list' within loop so create a holder

for (int i = 0; i < [list count]; i++) {
    [listHolder replaceObjectAtIndex:i withObject:[bin objectAtIndex:i]];
}

두 번째 배열은 무엇입니까? Listholder 라고 불리는? 내 말은,이 맥락에서 배열을 참조하는 데 어떤 용어가 사용됩니까?

도움이 되었습니까?

해결책

이 맥락에서 listHolder a라고 불립니다 복사.

코드에는 버그가 있습니다. 이 줄은 실제로 사본을 만드는 것이 아니라 listHolder 그리고 list 둘 다 동일한 배열 개체를 참조합니다.

NSMutableArray *listHolder = list;

이것은 실제 사본입니다.

NSMutableArray *listHolder = [list mutableCopy];

사용하는지 확인하십시오 mutableCopy 그리고 단지 copy 사본을 변동성있게하려면. 그만큼 copy 방법은 NSMutableSet, NSMutableDictionary, 기타 등등.

또한 다른 사람들이 언급 한 바와 같이 for (item in collection) 열거 된 컬렉션을 돌연변이 할 수 없다는 루프. 정상으로 for (;;) 돌연변이는 완벽하게 괜찮지 만 컬렉션의 항목 수가 변경되면 이상한 결과를 초래할 수 있습니다.

다른 팁

이것은 완벽하게 유효합니다.

NSMutableArray *bin = [NSMutableArray arrayWithObjects:@"0", @"1", …, @"7", nil];
NSMutableArray *list = [NSMutableArray arrayWithObjects:@"a1", …, @"e4", nil];

// NSInteger should be used instead of int
for (NSInteger i = 0; i < [list count]; i++) {
    [list replaceObjectAtIndex:i withObject:[bin objectAtIndex:i]];
}

배열을 a 내부로 변경할 수 없습니다 for … in 또는 NSEnumerate 루프이지만 색인을 사용하는 것은 완벽하게 유효합니다.

나를 괴롭히는 것은 포인터에 대한 당신의 오해입니다.
배열을 돌연변이 할 수없는 루프 인 경우 배열을 복사하지 않고 배열에 대한 포인터 만 복사하여 허용되지 않는 배열을 효과적으로 수정합니다. (이것이 효과가 있는지 확실하지 않습니다.)

포인터를 복사하는 대신

// can't mutate 'list' within loop so create a holder
NSMutableArray *listHolder = list;

진정한 사본 만들기 :

NSMutableArray *copy = [[list mutableCopy] autorelease];

실제로 사본을 만들어야하는 경우 그 내용에 따라 이름을 지정하려고합니다. 예를 들어:

NSMutableArray *views;
NSMutableArray *reorderedViews = [views mutableCopy];

// reorder reorderedViews

때로는 충분한 이름을 찾기가 어렵습니다. 그러면 나는 보통 만 사용합니다. nameCopy.

보편적으로 사용되는 특정 문체 나 일반적인 이름은 없으며, 이에 대한 코드는 이후에 코드이며, 적절한 용어를 사용하는 경우 사용합니다.

일반적으로 이러한 종류의 상황에서 특정 이름이 없다면 사람들은 메모리 블리팅에서와 같이 원래 목록을 "소스"(SRC)와 최종 목록을 "대상"(DST)이라고합니다. 스타일 운영.

원래 nsarray의 임시 변이 가능한 사본은 내가 그것을 언급하는 방법입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top