我有一個奇怪的問題。我在我的應用程序中使用Apple私有框架中的方法。當我第一次打電話時,它就可以工作。當我第二次立即調用它時,它們之間沒有任何東西,它會崩潰。但是,如果我將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’。」 這裏是堆棧跟蹤:
#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似乎能夠防止崩潰?
它可能與NSLog無關。我會發布一些代碼。 – 2010-08-21 04:01:32
請編輯代碼和堆棧跟蹤到您的問題。 – 2010-08-21 05:35:22
你對命名約定是正確的,但由於'MTDeviceCreateList'是一個私有函數,它可能違反/不符合它。 (也許這意味着「創建設備數組,以便在進程期間保持活動狀態,並將指針返回給它」)。嘗試在樂器的殭屍工具下運行程序(崩潰)。因此,您應該能夠證明您的版本是否過度釋放,或者以其他方式確定崩潰的真正原因。 – 2010-08-21 12:12:53