1

我开发了一个蓝牙应用程序,它在 iOS 6 上运行良好,但是当我在 iOS 7 上运行它时,应用程序在 -didDiscoverPeripheral 回调中崩溃。崩溃信息表明在 CBPeripheral 对象上调用了一个版本。我使用 ARC 进行内存管理,这是我的声明、CBPeripheral 对象的初始化和回调代码:

@interface BrLEDiscovery () <CBCentralManagerDelegate, CBPeripheralDelegate> {
    CBCentralManager    *centralManager;
    CBPeripheral *currentperipheral;
    BOOL                pendingInit;
}


- (id) init
{
    self = [super init];
    if (self) {
        pendingInit = YES;
        centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:dispatch_get_main_queue()];
       currentperipheral=[[CBPeripheral alloc]init];
        founddevice=FALSE;
        foundPeripherals = [[NSMutableArray alloc] init];
        connectedServices = [[NSMutableArray alloc] init];

    }
    return self;
}

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{ NSLog(@"Found Peripheral %@",[peripheral name]);

    if ([[peripheral name] isEqualToString:peripheralname]) {
        founddevice=TRUE;
        currentperipheral=peripheral;

        if (![foundPeripherals containsObject:peripheral]) {
            [foundPeripherals addObject:peripheral];
            [discoveryDelegate discoveryDidRefresh];
            [discoveryDelegate DiscoveryDidFindDevice:peripheral];

        }

        [RecursiveScanTimer invalidate];
    }


}
4

1 回答 1

2

根据您的描述,很可能会在这条线上崩溃:

currentperipheral=peripheral;

CBPeripheral对我来说,在你的 init 中分配一个对象然后在未知时间分配外设(尤其是使用 arc)有点麻烦。如果您想保留对发现的外围设备的引用,只需CBPeripheral在您的接口中创建一个对象,保留发现的外围设备,并将其分配给您的接口外围设备。

试试这样的事情:

currentPeripheral = [discoveredPeripheral retain];//where discoveredPeripheral is the one given in the delegate callback

我个人不会将 arc 用于我的任何与 corebluetooth 相关的应用程序。不过,您需要非常小心 corebluetooth 框架和外围参考......它会变得混乱。

注意:如果您并不总是需要与外围设备直接联系,那么只需记录CFUUIDRef(或identifier对于 iOS 7)并在需要时检索外围设备通常会很方便......祝您好运!

于 2013-09-24T22:23:41.167 回答