2009-07-01 4 views
9

동일한 값 (NSNumber가 모두 1로 초기화 됨)의 객체로 NSArray를 만들려고하지만 카운트가 다른 변수를 기반으로합니다. C 스타일 배열을 다루는 것을 제외하고는 NSArray의 인 타ializers 중 하나를 사용하여이 작업을 수행하는 방법이없는 것 같습니다.숫자 N으로 초기화 된 NSArray 만들기 동일한 객체의 모든 객체

짧은 방법이 있는지 알고 싶습니다.

이 내가 무엇을 찾고 있습니다 :

NSArray *array = [[NSArray alloc] initWithObject:[NSNumber numberWithInt:0] 
              count:anIntVariable]; 

의 NSNumber는 본질적으로 어떤 NSObject의 수, 단지 하나의 예를 들어 여기에있다.

답변

3

변경할 수없는 형식의이 구조가 유용 할 이유가 전혀 없지만 귀하의 이유가 확실합니다.

난 당신이 for 루프와 더불어,있는 NSMutableArray를 사용하여 구축 할 수 있지만 선택의 여지가 있다고 생각하고, 그 결과가 변경 가능하지 않는 것이 정말 중요한 경우에,있는 NSArray를 구성하고 사용하지 않는 arrayWithArray :

+2

카운트 1 (그리고 오토 릴리즈를) 유지와 배열을 반환하는 단지 -copy 사용, 불변의 사본을 얻을합니다. –

+2

사실, -copy는 소유하고있는 당신이 소유하고있는 불변의 배열을 반환하고/autorelease를 릴리즈해야합니다. 보유 할 수있는 개수는 다른 배열이 몇 개인 지에 따라 달라질 수 있습니다. 결코 카운트를 유지하는 것에 대해 이야기하지 않는 것이 최선입니다. –

+1

우수한 구별 - 나는 정정을 세웠다. 일반적으로 사본은 사용자가 소유하고있는 새로 초기화 된 객체를 반환하지만 특정 상황의 의미는 그렇지 않으면 지시 할 수 있습니다. 보유 수는 대개 1이지만 더 높을 수도 있고 다른 사람이 자동 수 있습니다. 따라서, 자신의 호출을 유지/해제/자동 해제 사이에 균형을 유지하는 것이 가장 바람직하다는 것이 맞습니다. –

2

나는 @ mmc에 동의합니다. 동일한 객체를 N 번 사용하는 대신에 그러한 구조를 갖는 타당한 이유가 있는지 확인하십시오.하지만 그렇게 할 것이라고 가정합니다.

가 약간 빠른 것 불변의 배열을 구성하는 또 다른 방법입니다 만, 다음과 같이 객체의 C 배열을 생성하고있는 NSArray의 +arrayWithObject:count: 방법에 전달 (오토 릴리즈 배열을 반환하는 마음을)이 필요합니다

id anObject = [NSNumber numberWithInt:0]; 
id* buffer = (id*) malloc(sizeof(id) * anIntVariable); 
for (int i = 0; i < anIntVariable; i++) 
    buffer[i] = anObject; 
NSArray* array = [NSArray arrayWithObjects:buffer count:anIntVariable]; 
free(buffer); 

더 까다로운 포인터 수학으로도 같은 결과를 얻을 수 있지만 그 이득은 매우 사소합니다. 어쨌든 관심이 있으시면 댓글을 올리십시오.

+0

내 지식이 약간 불완전하기 때문에 내가 틀렸다면 나에게 맞는 것이지만, * array의 모든 요소가 같은 NSNumber 객체가되고 다른 객체가 같은 값으로 초기화되지 않을까? NSNumber가 변경되지 않았으므로 어쨌든 중요하지 않겠지 만 Boon이 요청한 것입니다. – alanlcode

+0

@alanlcode : [NSNumber numberWithInt : 0]이 어쨌든 싱글 톤을 거의 반환하기 때문에 이것은 무의미한 것 같습니다. NSNumber *에 대한 고유 한 포인터를 보장 할 수있는 방법이 없습니다. 따라서 어떤 방식 으로든이 문제를 처리해야합니다. 문제가된다면 실제로 허용되는 의미 체계로 클래스를 직접 만들어야합니다. 두 객체는 ​​다르지만 같은 수를 나타냅니다. –

+0

매우 사실입니다. 또한, NSValue의 인스턴스 (그리고 그것을 하위 클래스로하는 NSNumber)는 변경할 수 없기 때문에 같은 값을 가진 N 개의 객체를 갖는 것은 무의미합니다. 각 인덱스에 동일한 객체가 기능적으로 같고 메모리를 적게 사용합니다. 정말 궁금하다면 객체를 삽입 할 때마다 -copy 및 -autorelease를 수행하고 인스턴스가 다른지 확인하십시오. 나는 이런 자신을 할 이유가 없다. –

2

아마도 NSArray에 그러한 메소드가 없다는 이유는 의미가 잘 정의되지 않았기 때문일 수 있습니다. 당신의 경우에, 불변의 NSNumber가 있으면, 모든 다른 의미가 동일하지만, 당신이 추가하고있는 객체가 NSMutableString과 같은 가변 객체라면 상상해보십시오.

세 가지 의미가 있습니다

  • 유지 - 동일한 가변 문자열 열 포인터로 끝날 것, 그리고 하나를 변경하면 모든 열을 변경합니다.

  • 사본 - 동일한 값을 가진 문자열을 immeduable 동일한 불변의 문자열 열 포인터, 또는 아마도 10 개의 다른 포인터와 끝까지 싶지만, 어느 쪽이든 당신은 그들 중 하나를 변경할 수 없습니다 것 .

  • mutableCopy - 당신은 10 개의 다른 가변 문자열 객체로 끝날 것입니다. 그 중 하나는 독립적으로 변경할 수 있습니다.

그래서 애플은 방법의 세 가지 변종을 작성하거나 못생긴 둘의 의미를 제어하는 ​​매개 변수의 일종을, 그래서 대신에 그들은 코드를 작성하는 방법에 남아 있었다. 원하는 경우 NSArray 범주 메서드로 추가 할 수 있습니다. 의미 론적 옵션을 이해하고 명확하게 이해하십시오.

있어서

-(id)initWithArray:(NSArray *)array copyItems:(BOOL)flag 

이 동일한 문제를 갖는다.

arrayWithObjects : count :를 사용하는 Quinn의 솔루션은 합리적으로 좋은 것으로, 일반적인 경우에 대해 얻을 수있는 최상의 방법 일 것입니다. 그것을 NSArray 범주에 넣으십시오.

14

나는 이것을 위해 쓸 수있었습니다 소감 코드는 다음과 같습니다

id numbers[n]; 
for (int x = 0; x < n; ++x) 
    numbers[x] = [NSNumber numberWithInt:0]; 
id array = [NSArray arrayWithObjects:numbers count:n]; 

당신이 엑스 코드는 기본적으로 사용 C99과 실행 길이 결정 C-배열을 만들 수 있기 때문에이 작동합니다. 그들은 모두 같은 값 경우 (INT의 캐스트가 나쁜 비록)

은 또한 memset 함수를 사용할 수 있습니다

id numbers[n]; 
memset(numbers, (int)[NSNumber numberWithInt:0], n); 
id array = [NSArray arrayWithObjects:numbers count:n]; 

당신이,이 코드 해야 작업을 필요로 얼마나 많은 개체를 알고있는 경우 나는 그것을 테스트하지 않은 비록 :

id array = [NSArray arrayWithObjects:(id[5]){[NSNumber numberWithInt:0]} count:5]; 
+0

아, 마지막으로 brewmaster에게 감사드립니다. –

+0

마지막 작품은 어떻게 작동합니까? 단일 요소를 포함하는 배열을 5 배열로 캐스팅하지 않습니까? – bcattle

+0

이것은 C의 버릇입니다. 5 개의 요소로 이루어진 C 배열을 모두 NSNumber 인스턴스로 초기화하면이 경우 캐스트는 배열의 크기를 알 수 있도록 컴파일러에 대한 명령어가됩니다. – mxcl