Mac OSX上でIOBluetoothフレームワークを使用してデバイスを検出しています。私はいくつかのコールバック関数内にNSLog()
を追加したので、私は進捗状況を知っています。フラグ `-fobjc-arc`が使用されているときのセグメンテーションフォルト
私は、このようなコマンドライン上gccでコードをコンパイルする場合、すべてが正常(ソースファイルf.m
、出力a
)の作品:
gcc -o a f.m -framework Foundation -framework IOBluetooth
しかし、私は自動リファレンスを確保するために-fobjc-arc
フラグを追加した場合カウント:
gcc -fobjc-arc -o a f.m -framework Foundation -framework IOBluetooth
コンパイルはまだ大丈夫ですが、ワンセグ障害のいずれかで結果のファイル./a
を実行:
2017-06-21 22:06:23.150 a[718:17437] Program started ...
Segmentation fault: 11
または永遠にそこにぶら下がっ:
2017-06-21 22:06:27.070 a[721:17809] Program started ...
時にはそれが時にはそれが障害をSEG、ハングアップします。この動作は矛盾しています。 -fobjc-arc
フラグを追加しないと、すべてが正常に動作します(少なくとも表面上)。
私の質問はなぜ-fobjc-arc
フラグを追加した後の動作ですか?
それが助け場合は、完全なソースファイルはここにある:
#import <IOBluetooth/IOBluetooth.h>
@interface InquiryDelegate : NSObject <IOBluetoothDeviceInquiryDelegate>
@end
@implementation InquiryDelegate
-(void)deviceInquiryStarted:(IOBluetoothDeviceInquiry *)sender
{
NSLog(@"Inquiry started ...");
}
-(void)deviceInquiryDeviceFound:(IOBluetoothDeviceInquiry *)sender
device:(IOBluetoothDevice *)device
{
NSLog(@"Device found");
}
-(void)deviceInquiryComplete:(IOBluetoothDeviceInquiry *)sender
error:(IOReturn)error
aborted:(BOOL)aborted
{
NSLog(@"Inquiry complete");
}
-(void)deviceInquiryUpdatingDeviceNamesStarted:(IOBluetoothDeviceInquiry *)sender
devicesRemaining:(uint32_t)devicesRemaining
{
}
-(void)deviceInquiryDeviceNameUpdated:(IOBluetoothDeviceInquiry *)sender
device:(IOBluetoothDevice *)device
devicesRemaining:(uint32_t)devicesRemaining
{
}
@end
int main(int argc, const char* argv[]) {
@autoreleasepool {
NSLog(@"Program started ...");
IOBluetoothDeviceInquiry* di = [[IOBluetoothDeviceInquiry alloc]
initWithDelegate:[[InquiryDelegate alloc] init]];
[di start];
[[NSRunLoop currentRunLoop] run];
}
}
誰もが疑問に思っている場合は、私の目標は関与なしGUIで、JNIプロジェクトで使用するための動的ライブラリを生成することです。これは、BluetoothがMac上で行われる方法でいくつかの経験を積み、Objective-Cに慣れ親しんだ私の試みです。私はLinuxのバックグラウンドから来ているので、可能であればコマンドラインにとどまることを好みます。
ありがとうございます。 @Willekeと@Ssswift両方に
InquiryDelegate* g = [[InquiryDelegate alloc] init];
IOBluetoothDeviceInquiry* di = [[IOBluetoothDeviceInquiry alloc]
initWithDelegate:g];
感謝を:上記のコメンターによって与えられたヒントに
デリゲートを保持しているため、デリゲートが割り当て解除されていませんか? – Willeke
ARCが私のためにそれを世話してはいけませんか? –
ARCはあなたに強い参照がないことを見て、あなたのためにオブジェクトの割り当てを解除することによって、 "それを世話しています"。 – Ssswift