У меня странная проблема.Я использую метод из частных структур Apple в моем приложении.Когда я звоню в первый раз, это работает.Когда я вызываю его во второй раз сразу, без перерыва, происходит сбой.Тем не менее, если я поставлю NSLog между двумя вызовами, это прекрасно работает.Поэтому я пытаюсь удалить NSLog и поместить for-loop, sleep (), printf ("...") и fprintf (stderr, "...") между ними, чтобы эмулировать 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 »».А вот трассировка стека:
#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
Однако, если я поставлю NSLog ниже MTDeviceStart, он не будет аварийно завершаться.
Причина, по которой я добавил CFRelease((CFMutableArrayRef)deviceList)
в исходный код, заключается в том, что ядумаю, что объекты, созданные из функций с именем * Create * или * Copy *, должны быть освобождены сами.Но оказывается, что если я удаляю его, как это делает оригинальный код, он не рухнет, даже без использования NSLog.
Итак, может быть, это потому, что я слишком рано выпускаю deviceList
?Но если это так, почему NSLog, кажется, может предотвратить сбой?