2012-04-27 6 views
0

myLocationsArray가 불변이라고 선언되어 NSMutableArray에서 removeObjectAtIndex를 호출 할 때 예외가 발생하는 문제가있었습니다. 해당 배열에 대한 다른 모든 조작 괜찮 았어, 그것은 가장 정확하게 확실히 기타 등등하지만 어딘가에 불변으로 설정 점점지고 선언했다. 이 불변 설정하기 된 곳 찾기 위해 노력하고 잠시 동안 조사 후, 나는 그것을 나사 결정하고 단지 같은 변수를 다시 선언 :NSMutableArray를 NSMutableArray로 다시 초기화하십시오.

myLocationsArray = [[NSMutableArray alloc] initWithArray:[defaults 
objectForKey:MYLOCATIONSARRAY_KEY]]; 

을 바로 removeObjectAtIndex 호출하기 전에.

그러나 이것은 나쁘다는 것을 알고 있습니다. 동일한 변수에서 alloc/init을 두 번 호출합니다. 그러나 그것이 효과가있는 유일한 방법입니다. 내가이 같은 메모리 누수를 도입하지 않고 NSMutableArray이 변수를 생각 나게하는 방법이 있습니까?

+1

, 그렇지 않으면 누구든지 적절한 조언을 제공하기가 어렵습니다. –

답변

1

NSUserDefaults은 배열의 변경 불가능한 복사본을 반환합니다. NSArray 또는 NSMutableArray을 넣어도 상관 없습니다. 항상 불변의 복사본을 돌려줍니다.

그래서, 당신은

myLocationsArray = [[NSMutableArray alloc] initWithArray:[[[defaults objectForKey:MYLOCATIONSARRAY_KEY] mutableCopy] autorelease]]; 

또는 작업 할 수 변경 가능한 사본을 얻기 위해 이렇게 그냥이

myLocationsArray = [[defaults objectForKey:MYLOCATIONSARRAY_KEY] mutableCopy]; 
당신은 배열을 다루는이 발생할 수 있습니다 몇 가지 코드를 보여줄 필요가
+0

나는 결국 문제가 NSUserDefaults가 불변의 NSArrays를 반환하는 것과 함께 깨달았다.하지만 NSMutableArrays를 수정하여 다시 선언했다. – jamzsabb

0

선언은 중요하지 않습니다. 귀하의 오류는 런타임 오류입니다. myLocationsArray 변수에 불변의 배열 (NSArray)이 할당되어있는 것처럼 들리지만 어딘가에 다시 할당되거나 항상 불변인지 여부는 코드 조각에서 말할 수 없습니다.

1

프로그램이 예외를 throw하는 행 (removeObjectAtIndex을 포함하는 행)에 중단 점을 설정하고 디버거에서 실제 유형의 배열을 검사하도록 제안합니다. 배열 이름 위로 마우스를 가져 가면 뾰족한 객체에 대해 필요한 모든 정보를 제공하는 팝업 메뉴가 표시됩니다.

내가 예상하는 것은 객체가 NSArray (대 NSMutableArray) 인 것을 처음 발견 한 지점으로 되돌아가는 것을 발견했다는 것입니다.

1

NSUserDefaults으로 작업하는 것 같습니다. NSUserDefaults에서 나오는 모든 오브젝트는 사용자가 저장 한 내용에 관계없이 항상 불변입니다. NSUserDefaults은 사용자가 설정 한 특정 개체에 대한 참조를 유지하지 않으므로 데이터는으로 유지됩니다. 그것은 효과적으로 사본을 만들고 있습니다. NSUserDefaults에서 뭔가를 얻으면 저장 한 데이터에서 새로운 (변경 불가능한) 객체를 만들어서 제공합니다.

놀랍게도 NSUserDefaults에 저장된 내용을 변경할 수 없습니다. 새로 저장된 것을 저장하여 이전에 저장 한 내용을 대체하여 저장된 내용 만 변경할 수 있습니다.

+0

네, NSUserDefaults로 밝혀졌습니다. 나는 그것에 NSUserDefaults에서 데이터 BLOB를 할당하기 전에 NSMutableArray를 선언해야하고, 그것을 고쳐서 돌연변이를 허용한다. 감사! – jamzsabb

관련 문제