1

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]; 

感謝を:上記のコメンターによって与えられたヒントに

+1

デリゲートを保持しているため、デリゲートが割り当て解除されていませんか? – Willeke

+0

ARCが私のためにそれを世話してはいけませんか? –

+0

ARCはあなたに強い参照がないことを見て、あなたのためにオブジェクトの割り当てを解除することによって、 "それを世話しています"。 – Ssswift

答えて

0

おかげで、私は、デリゲートオブジェクトへの強い参照を追加することによって、問題を解決することができています。

関連する問題