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 ... 

有時掛起,有時賽格故障。行爲不一致。如果我不添加-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]; 
    } 
} 

如果你想知道,我的目標是生產中使用的動態庫的JNI項目,不涉及GUI。這是我試圖獲得一些藍牙在Mac上完成的經驗,並熟悉Objective-C。我來自Linux背景,所以如果可能的話,寧願留在命令行上。

在此先感謝。

+1

什麼都沒有堅持委託,因此它被釋放? – Willeke

+0

ARC不應該照顧這個嗎? –

+0

通過看到您沒有強烈的引用,併爲您解除分配對象,ARC正在「照顧該問題」。 – Ssswift

回答

0

由於通過上文給出的評論者的提示,我能夠通過添加強參考委託對象要解決的問題:

InquiryDelegate* g = [[InquiryDelegate alloc] init]; 

IOBluetoothDeviceInquiry* di = [[IOBluetoothDeviceInquiry alloc] 
            initWithDelegate:g]; 

由於兩者@Willeke和@Ssswift。