이상한 문제가 있습니다. 내 응용 프로그램에서 애플의 개인 프레임 워크에서 메서드를 사용하고 있습니다. 처음으로 전화를 걸면 작동합니다. 그 사이에 아무 것도없이 두 번째로 즉시 호출하면 충돌이 발생합니다. 그러나 두 통화 사이에 NSLog를 넣으면 멋지게 작동합니다. 그래서 NSLog를 제거하고 for-loops, sleep(), printf ("...") 및 fprintf (stderr, "...")를 NSLog를 에뮬레이트하기 위해 넣으려고했지만 도움이되지 않습니다. 어떻게 NSLog를 사용하는 방법을 알고 있는지 궁금합니다. 즉, NSLog는 실제로 메소드의 동작에 영향을 미치기 위해 무엇을합니까?NSLog는 실제로 무엇을합니까?
대단히 감사합니다!
편집 :
나는이 문제를 해결하기 위해 보인다. 나는 여기서 나의 해결책을 공유 할 것이고 그것이 어떤 사람들에게는 유용 할 수 있기를 희망한다.
MultitouchSupport.framework를 사용하여 멀티 터치 관련 응용 프로그램을 만들고 있습니다. http://aladino.dmi.unict.it/?a=multitouch의 코드를 복사하고 루프 끝에 CFRelease
을 추가했습니다. 그래서, 기본적으로 내 주요 방법은 다음과 같습니다
int main(void) {
int i;
NSMutableArray* deviceList = (NSMutableArray*)MTDeviceCreateList(); //grab our device list
for(i = 0; i<[deviceList count]; i++) { //iterate available devices
MTRegisterContactFrameCallback([deviceList objectAtIndex:i], touchCallback); //assign callback for device
MTDeviceStart([deviceList objectAtIndex:i], 0); //start sending events
}
CFRelease((CFMutableArrayRef)deviceList);
printf("Ctrl-C to abort\n");
sleep(-1);
return 0;
}
잠시 동안 실행 한 후, 그것은 "프로그램 신호 수신 :"가 표시됩니다 "."EXC_BAD_ACCESS를 내가 MTDeviceStart 아래 NSLog를 넣어 경우
그러나#0 0x7fff8795496e in ParsedMultitouchFrameRepInitialize
#1 0x7fff879565b1 in mt_HandleMultitouchFrame
#2 0x7fff87955a03 in mt_DequeueDataFromDriver
#3 0x7fff87955b29 in mt_DequeueMultitouchDataFromDriverThreadEntry
#4 0x7fff831b3456 in _pthread_start
#5 0x7fff831b3309 in thread_start
, 그것은 충돌하지 않습니다 그리고 여기에는 스택 추적입니다.
원래 코드에 CFRelease((CFMutableArrayRef)deviceList)
을 추가 한 이유는 * Create * 또는 * Copy *라는 이름의 함수로 만든 객체가 스스로 출시되어야한다고 생각하기 때문입니다. 그러나 원래 코드처럼 제거하면 NSLog를 사용하지 않아도 크래시가 발생하지 않습니다.
그래서 내가 deviceList
을 너무 일찍 릴리스했기 때문일 수 있습니다. 그렇다면 NSLog가 충돌을 막을 수있는 이유는 무엇입니까?
아마 NSLog와 관련이 없습니다. 나는 약간의 코드를 게시 할 것이다. –
질문에 코드와 스택 추적을 모두 편집하십시오. –
네이밍 규칙은 정확하지만 'MTDeviceCreateList'는 개인 기능이기 때문에 위반하거나 위반하고있을 수 있습니다. (아마 "프로세스 기간 동안 살아 남기 위해 의도 된 장치 배열을 만들고 포인터를 그 장치로 되돌려 놓는 것을 의미합니다.") Instruments 's Zombies 장비에서 프로그램을 실행하십시오 (충돌시). 이를 통해 공개가 과다 출시인지 여부를 입증하거나 충돌의 진정한 원인을 판단 할 수 있어야합니다. –