2011-10-07 2 views
0

저는이 코드를 오래 동안 보았지만 세상에서 무엇이 잘못되었는지 알 수 없습니다. SortFilteringController라는 클래스가 있는데,이 필터는 시스템 (내부 필터, 공용 필터, 정렬 옵션 등)에있는 다른 필터링을 관리합니다. 이들 각각은 배열에 저장됩니다. 그래서 나는 기본적으로 이러한 배열 중 하나를 취하는 convience 메서드를 사용하고 새로운 데이터로 다시 설정합니다.NSArray 딥 카피로 인해 충돌이 발생합니다

예를 들어, setInternalFilter는 그냥 호출합니다.

- (void) setInternalFilterTerms : (NSArray*) filterTerms { 

    [self resetArray: &_internalFilters withNewData:filterTerms]; 
} 

resetArray의 정의는, 단지에서 기존 (놓습니다), 복사 새 데이터를 덤프하는 것입니다.

- (void) resetArray: (NSMutableArray**) oldArray withNewData : (NSArray*) newData { 

    if (*oldArray != nil) { 
     [*oldArray release]; 
    } 


    NSMutableArray* newArray = [[NSMutableArray alloc] initWithArray:newData copyItems:YES]; 
    *oldArray = [newArray retain]; 
    [newArray release];  

} 

는하지만 내 문제는 내가 리셋 방법에서 충돌을 얻을 수있다. 시뮬레이터에는 없으며 장치에서만 작동합니다.

Thread 0 Crashed: 
0 libsystem_kernel.dylib   0x331a3a1c __pthread_kill + 8 
1 libsystem_c.dylib    0x3404c3b4 pthread_kill + 52 
2 libsystem_c.dylib    0x34044bf8 abort + 72 
3 libstdc++.6.dylib    0x30e4fa64 __gnu_cxx::__verbose_terminate_handler() + 376 
4 libobjc.A.dylib     0x30fda06c _objc_terminate + 104 
5 libstdc++.6.dylib    0x30e4de36 __cxxabiv1::__terminate(void (*)()) + 46 
6 libstdc++.6.dylib    0x30e4de8a std::terminate() + 10 
7 libstdc++.6.dylib    0x30e4df5a __cxa_throw + 78 
8 libobjc.A.dylib     0x30fd8c84 objc_exception_throw + 64 
9 CoreFoundation     0x33e5f1b8 -[NSObject(NSObject) doesNotRecognizeSelector:] + 96 
10 CoreFoundation     0x33e5e642 ___forwarding___ + 502 
11 CoreFoundation     0x33dd5178 _CF_forwarding_prep_0 + 40 
12 CoreFoundation     0x33dcb156 -[NSArray initWithArray:range:copyItems:] + 366 
13 CoreFoundation     0x33dcafce -[NSArray initWithArray:copyItems:] + 54 
14 Wine DB 1.1      0x001b6a2a -[SortFilterController resetArray:withNewData:] (SortFilterController.m:1310) 
15 Wine DB 1.1      0x001b4188 -[SortFilterController setInternalFilterTerms:] (SortFilterController.m:733) 

나는 아이폰 OS 5.0 GM 종자와 엑스 코드 4.2을 실행하고 있습니다. 장치가 여전히 실행 중입니다. 4.1.3. 그러나 그것은 차이를 올바르게 만들어서는 안된다. 그리고 오류는 "doesNotRecognizeSelector"입니다. 얼마나 이상한가.

감사합니다.

+0

오류의 전체 텍스트를 넣으십시오 - 시뮬레이터에는 있지만 장치는 없었던 인터페이스가있는 인스턴스를 발견했습니다. 어떤 셀렉터가 인식하지 못합니까? –

답변

1

oldArray == newData인지 확인합니다. 당신은 목표 - C의 설정 작업에 대한 기본 관용구이 있음을 알 수 있습니다 : newThing는 == 것은, 당신은 현재 일을 삭제하면

-(void) setFoo:(NSThing *)newThing 
{ 
    [newThing retain]; 
    [thing release]; 
    thing = newThing; 
} 

, 당신은 잘 원인 소멸자를 호출 할 수 있습니다. 그래서 당신은 항상 첫 번째를 유지합니다.

복사 할 수있는 대상을 공개 할 수 있습니다. 또한 최신 가비지 콜렉터를 사용하면 장치가 시뮬레이터보다 빨리 정리 될 수 있습니다. 두 플랫폼 모두에 버그가 있지만 메모리 관리자의 불확실한 특성으로 인해 일시적이라고 생각할 수 있습니다.

다른 경우, 코드를 검토하여 나중에 함수에서 사용해야 할 수도있는 객체를 해제하지 않았는지 확인하십시오. 변수 이름이 다르므로 같은 객체가 아님을 의미하지는 않습니다.

+0

이것이 이유였습니다. 저를 위해 문제점을 고치기 전에 보유를두기. – Yenyi

0

배열에 저장된 객체가 NSCopying 프로토콜을 따르지 않을 수 있습니까? 따라서 이니셜 라이저가 copy 메서드를 호출하려고하면 처리 방법을 모른다는 것입니까?

관련 문제