2013-04-11 5 views
0

이것은 this one과 관련된 질문입니다.메시지를 보낼 때 NSMutableArray가 먼저 유지 한 다음 두 번 릴리스 할 수 있습니까?

변경할 수있는 배열에서 개체를 제거 할 때 그 개체에 '보관'메시지가 전송 될 수 있다는 것을 알았 기 때문에 위의 질문을 검색했습니다. w.m은 NSMutableArray의 내부 구현 객체를 유지 한 다음 해당 객체를 제거 할 때 두 번 놓으십시오.

제 질문은 : 이것에 대한 증거가 있습니까? 또는 누구든지 관련 세부 사항을 알고 있습니까?

다음 로그를 분석 할 때이 문제를 만났습니다. 내 코드에 문제가 있다는 것을 알고 있지만 내 우려는 버그 자체에 관한 것이 아니라 'retain 작업이 있을지 여부 removeObject '일 때.

Exception Type: EXC_BAD_INSTRUCTION (SIGILL) 
Exception Codes: 0x0000000000000001, 0x0000000000000000 
Crashed Thread: 0 Dispatch queue: com.apple.main-thread 

Application Specific Information: 
objc[299]: FREED(id): message retain sent to freed object=0x23f62a0 

Thread 0 Crashed: Dispatch queue: com.apple.main-thread 

0 libobjc.A.dylib     0x9a3694fd _objc_error + 116 
1 libobjc.A.dylib     0x9a369533 __objc_error + 52 
2 libobjc.A.dylib     0x9a36783a _freedHandler + 58 
3 com.apple.CoreFoundation  0x9879a8cb -[NSMutableArray removeObject:range:identical:] + 331 
4 com.apple.CoreFoundation  0x9879a770 -[NSMutableArray removeObject:] + 96 

답변

0

NSMutableArray가 내부적으로 수행하는 작업은 중요하지 않습니다. 그것은 당신에게 아무런 관심도 없습니다. 메모리 관리 규칙을 따르는 한 (예 : 나중에 유지해야하는 항목을 유지하고 보존 한 것만 릴리스하는 경우) 임의의 위치에서 20 배 여분의 시간을 유지하고 해제하는지 여부는 중요하지 않습니다. 여분의 릴리스 - 릴리스 쌍을 추가하면 결코 프로그램의 정확성이 저하되지 않습니다.

크래시가 발생하는 경우 코드에서 문제가있는 것입니다.

+0

답변 해 주셔서 감사합니다. 나는 내 코드에 뭔가 (나는 이미 그것을 찾았습니다.) 무언가가 있다는 것에 전적으로 동의합니다. – sehone

+0

그러나 내 관심사는 버그 자체에 관한 것이 아니라 로그 정보'메시지가 해제 된 개체로 전송 됨 '입니다. Apple의 문서를 읽었지 만 NSMutableArray가'removeObject' 중에 '보존'작업을 수행한다고 들었습니다. 그래서 실제로 나는 누군가가 여기에 증거를 공유 할 수 있기를 기대하고 있습니다. – sehone