我遇到了一个奇怪的问题。我在我的应用程序中使用了苹果私有框架中的一个方法。当我第一次调用它时,它可以正常工作。但是,如果我在没有任何其他操作的情况下立即第二次调用它,它就会崩溃。然而,如果我在两次调用之间放置NSLog,它就能够正常工作。所以我尝试在它们之间放置for循环、sleep()、printf("...")和fprintf(stderr, "...")来模拟NSLog,但这并没有帮助。我想知道这个方法是如何知道我使用了NSLog的?换句话说,NSLog到底对方法的行为产生了什么影响?
非常感谢!
编辑:
我似乎解决了这个问题。我将我的解决方案分享在这里,希望对某些人有用。
我正在使用MultitouchSupport.framework创建一个多点触控相关的应用程序。我从http://aladino.dmi.unict.it/?a=multitouch复制了代码,并在循环的结尾添加了CFRelease。因此,基本上我的主要方法看起来像这样:
然而,如果我将NSLog放在MTDeviceStart下面,它就不会崩溃。
我在原始代码中添加CFRelease((CFMutableArrayRef)deviceList)的原因是,我认为从*Create*或*Copy*命名的函数创建的对象应该由我们自己释放。但事实证明,如果像原始代码一样删除它,即使不使用NSLog,它也不会崩溃。
所以,也许是因为我释放了deviceList太早?但如果是这样,为什么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似乎能够防止崩溃呢?
MTDeviceCreateList
是一个私有函数,使用它可能会违反或不符合规范。(也许它的意思是“创建设备数组,该数组旨在在整个进程的生命周期内保持活动状态,并返回指向它的指针”)。尝试在Instruments的Zombies工具下运行程序(带崩溃),这样你就可以证明你的释放是过度释放,或者确定崩溃的真正原因。 - Peter HoseyMT
函数不会保留您传递给它们的对象,因此如果您释放设备列表,则这些对象也会过早消失。 - Georg Fritzsche