私は奇妙な問題を抱えています。私は自分のアプリケーションでAppleのプライベートフレームワークのメソッドを使用しています。初めて呼び出すと動作します。何もせずにすぐに2回目に呼び出すと、クラッシュします。ただし、2つの呼び出しの間にNSLogを配置すると、うまく機能します。そこで、NSLogを削除し、forループ、sleep()、printf( "...")、およびfprintf(stderr、 "...")をそれらの間に配置して、NSLogをエミュレートしようとしましたが、役に立ちません。NSLogを使用していることをメソッドがどのように認識しているのでしょうか。言い換えると、NSLogはメソッドの動作に影響を与えるために実際に何をしますか?
どうもありがとうございます!
編集:
私はこの問題を解決しているようです。私はここで私の解決策を共有し、それが何人かの人々に役立つかもしれないことを願っています。
MultitouchSupport.frameworkを使用してマルチタッチ関連のアプリケーションを作成しています。http://aladino.dmi.unict.it/?a=multitouchからコードをコピーしCFRelease
、ループの最後にaを追加しました。したがって、基本的に、私のメインメソッドは次のようになります。
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はクラッシュを防ぐことができるように見えるのでしょうか。