>

이 원인을 파악할 수 없습니다. 기본적으로 몇 가지 다른 '작업'이 내 앱에서 서로 충돌합니다. 버튼을 누르면이 코드가 제대로 실행됩니다.

PalAppDelegate *dataCenter = (PalAppDelegate *)[[UIApplication sharedApplication] delegate];


[dataCenter.colourPalettesContainer addObject:[NSNumber numberWithInt:5]];

필요한만큼 여러 번 할 수 있습니다. 그러나 다른 작업을 수행 할 때 (그리고 몇 가지가 발생하면)이 코드와 관련이 있습니다.

PalAppDelegate *dataCenter = (PalAppDelegate *)[[UIApplication sharedApplication] delegate];
[dataCenter.colourPalettesContainer removeObjectAtIndex:touchDownID];
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setObject:dataCenter.colourPalettesContainer forKey:@"container"];
[prefs synchronize];

그리고 :

dataCenter.colourPalettesContainer = [prefs objectForKey:@"container"];

이후 첫 번째 코드를 다시 실행하면 "mutating method sent to unmutable object"오류와 함께 충돌이 발생합니다. 이걸 어떻게 막을 수 있습니까?

편집 : 그래서 아래 답변에서 문제를 발견했습니다. 그들이 제안한 다른 방법이 있습니까?

  • 답변 # 1

    NSUserDefaults는 불변 배열을 반환합니다. 백업을로드 할 때 변경 가능한 사본을 만들어야합니다.

    NSMutableArray *mutableArray = [[prefs objectForKey:@"container"] mutableCopy];
    dataCenter.colourPalettesContainer = mutableArray;
    [mutableArray release];
    
    

    NSMutableArray를 저장하기 때문에 어레이 내부에서 약간의 조작을 수행해야 할 수도 있습니다.

  • 답변 # 2

    NSUserDefaults  저장된 내용이 변경 가능하더라도 항상 변경 불가능한 객체를 반환합니다. 이 문제를 해결하려면 변경 가능한 사본을 만들어야합니다. -mutableCopy 부터  호출자가 소유 한 객체를 반환하며 (자동) 해제되어야합니다.

    dataCenter.colourPalettesContainer = [[[prefs objectForKey:@"container"] mutableCopy] autorelease];
    
    

    (편집) 다른 질문에 대한 응답으로 -mutableDeepCopy NSArray&NSDictionary 메소드를 게시했습니다. 문제가 컬렉션의 더 깊은 중첩과 관련되어 있고 변경이 가능하도록모두필요한 경우 이것이 도움이 될 수 있습니다.

  • 답변 # 3

    어레이의 특정 색인에서 개체를 제거하려면. (Swift 3.0)

    let fullArray : NSArray = Userdefaults().value(forKey: "YOUR_ARRAY_STRING") as! NSArray
    var mutableArray : [AnyObject] = fullArray as [AnyObject]
    mutableArray.remove(at: INDEX_TO_REMOVE) //Eg: mutableArray.remove(at: 0)
    mutableArray.append(ARRAY_TO_APPEND)
    
    

관련 자료

  • 이전 c++ - __device__ 클래스 멤버 함수가 장치 변수의 값을 변경 한 후 장치에서 호스트로 복사 할 때 cudaMemcpy 오류
  • 다음 파이썬의 최대 함수가 잘못된 결과를 반환