2012-07-21 6 views
3

개체의 인스턴스에 대한 포인터 배열을 사용하고 싶지만 필요시 (예 : 느슨하게) 해당 개체의 인스턴스 만 만들고 싶습니다. 배열은 UI의 테이블에 해당하므로 각 배열 인덱스는 테이블 행에 해당합니다.objC에 nil 포인터 배열을 저장하는 방법은 무엇입니까?

NSMutableArray를 사용하여 개체 인스턴스에 대한 포인터를 유지하고 싶습니다 (사용자가 UI에서 해당 행을 선택할 때 발생 함).

테이블의 행이 선택되면 해당 배열 항목이 검사됩니다. 포인터 값이 nil이면 인스턴스가 아직 생성되지 않았으므로 해당 지점에서 인스턴스가 생성되고 객체 포인터는 해당 인덱스 배열 항목에 저장됩니다.

분명히, 이것은 처음에는 nil 포인터의 배열로 시작해야하지만, objC는 NSArray에 nil 포인터를 넣을 수 없습니다.

배열 인덱스가 테이블 행과 일치하지 않기 때문에 개체를 만들 때 배열에 개체를 추가 할 수 없습니다.

여기에있는 최상의 objC 솔루션은 무엇입니까?

답변

7

목표 C에서 관용적 용액을 사용하는 것이다 NSNull :

NSNull 클래스 컬렉션 오브젝트에 Null 값 (무 값을 허용하지 않은) 표현하기 위해 사용되는 단일 객체를 정의 .

당신의 NSMutableArray을 만들고 [NSNull null] 객체를 채울 :

NSMutableArray *array = [NSMutableArray arrayWithCapacity:N]; 
for (int i = 0 ; i != 10 ; [a addObject:[NSNull null]], i++); 

당신이 당신의 NSMutableArray에서 개체의 존재 여부를 확인 [NSNull null]에 인덱스의 객체를 비교

: 만약 그들이 실제 대상으로 교체하십시오. 그렇지 않으면 실제 오브젝트가 이미 있습니다.

if ([array objectAtIndex:index] == [NSNull null]) { 
    MyRealObject realObject = [[MyRealObject alloc] init]; 
    [array replaceObjectAtIndex:index withObject:realObject]; 
} 

** 편집 요약 ** 루프를 사용하여 배열을 초기화하도록 수정되었습니다 (감사 : bbum).

+0

훌륭해, 내가 찾던 해결책이다. 고마워. – Snips

+0

작동하지 않습니다. 'arrayWithObjects : count :'의 첫 번째 매개 변수는 객체의 언어 배열을 가리키는'(id *) '이어야하고'N'은 객체의 수보다 커서는 안됩니다. – bbum

+0

@bbum 이것은 고쳐졌습니다, 고마워요! – dasblinkenlight

0
+0

+1 및 initWithCapacity : 가변 배열을 할당하는 중 –

+3

답장을 보내 주셔서 감사합니다.불행히도 'arrayWithCapacity'는 * potential * 용량을위한 메모리를 예약합니다. 배열은 객체가 추가 될 때 계속 확장됩니다 (처음에는 비어 있습니다). 또한 [배열 수]의 기존 값을 초과하는 객체는 삽입 할 수 없습니다.이 값은 지정된 용량이 있더라도 처음에는 0입니다. 또한 nil 값을 삽입 할 수 없습니다. – Snips

3

NSMutableArray는 스파 스 배열을 지원하지 않습니다. 따라서 NSNull 인스턴스 (또는 다른 "no object"마커)로 배열을 미리 시드 할 수 있습니다. 예 :

a = [NSMutableArray array]; 
for(int i = 0; i<numberNeeded; i++) [a addObject:[NSNull null]]; 

또는 배열이 정말로 희박한 경우 대신 일종의지도를 사용하는 것이 좋습니다. NSMutableDictionary는 작동하지만 키와 모든 boxing/un-boxing에 대한 객체를 필요로하는 경우도 있습니다. 또는 CFDictionary를 객체 값과 함께 정수 키를 사용하도록 쉽게 구성 할 수 있습니다.

색인에 의한 검색은 분명히 느리지 만 그 차이는 대부분 (모두는 아님) 일 가능성이 낮습니다.

관련 문제