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背景,所以如果可能的話,寧願留在命令行上。
在此先感謝。
什麼都沒有堅持委託,因此它被釋放? – Willeke
ARC不應該照顧這個嗎? –
通過看到您沒有強烈的引用,併爲您解除分配對象,ARC正在「照顧該問題」。 – Ssswift