使用标志“-fobjc-arc”时出现分段错误
Segmentation fault when flag `-fobjc-arc` is used
我在 Mac OSX 上使用 IOBluetooth 框架来进行设备发现。我在回调函数中添加了一些NSLog()
,所以我知道进度。
如果我像这样在命令行上用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 背景,所以如果可能的话我更愿意留在命令行上。
提前致谢。
感谢上面评论者的提示,我可以通过添加对委托对象的强引用来解决问题:
InquiryDelegate* g = [[InquiryDelegate alloc] init];
IOBluetoothDeviceInquiry* di = [[IOBluetoothDeviceInquiry alloc]
initWithDelegate:g];
感谢@Willeke 和@Ssswift。
我在 Mac OSX 上使用 IOBluetooth 框架来进行设备发现。我在回调函数中添加了一些NSLog()
,所以我知道进度。
如果我像这样在命令行上用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 背景,所以如果可能的话我更愿意留在命令行上。
提前致谢。
感谢上面评论者的提示,我可以通过添加对委托对象的强引用来解决问题:
InquiryDelegate* g = [[InquiryDelegate alloc] init];
IOBluetoothDeviceInquiry* di = [[IOBluetoothDeviceInquiry alloc]
initWithDelegate:g];
感谢@Willeke 和@Ssswift。