Objective c 目标C带块的自动释放对象

Objective c 目标C带块的自动释放对象,objective-c,objective-c-blocks,Objective C,Objective C Blocks,我有一个像这样使用的对象 [PeripheralManager readValueForCharacteristic:[CBUUID UUIDWithString:CHARACTERISTIC_TX_POWER_LEVEL] inService:[CBUUID UUIDWithString:SERVICE_TX_POWER]

我有一个像这样使用的对象

[PeripheralManager readValueForCharacteristic:[CBUUID UUIDWithString:CHARACTERISTIC_TX_POWER_LEVEL]
                                                        inService:[CBUUID UUIDWithString:SERVICE_TX_POWER]
                                                  completionBlock:^(NSData *value) {
                                                          //code
                                                  }];
问题是,如果调用
completionBlock
时没有将对象保存在强属性中,应用程序就会崩溃

您可以说“将您的外围设备管理器保存在一个强大的属性中”。。。在某些情况下,我必须读取一个值,然后再读取另一个值,以此类推,可能是3到4次

在另一种情况下,可能会调用类方法,该方法返回块中的一些值,并且块不会被释放。有没有办法将mi PeripheralManager保留在内存中


编辑

    + (id)readValueForCharacteristic:(CBUUID *)cUUID
                           inService:(CBUUID *)sUUID
                     completionBlock:(completionBlock)completionBlock
    {
        return [[self alloc] initForReadValueForCharacteristic:cUUID
                                                     inService:sUUID
                                               completionBlock:completionBlock];
    }

    - (id)initForWriteValue:(unsigned char)value
     forCharacteristic:(CBUUID *)cUUID
             inService:(CBUUID *)sUUID
       completionBlock:(completionBlock)completionBlock
    {
        self = [super init];

        if (self)
        {
            self.completionBlock = [completionBlock copy];
            self.accessType = PeripheralAccessTypeWrite;
            self.valueToSet = value;

            if (cUUID && sUUID)
            {
                self.sUUID = sUUID;
                self.cUUID = cUUID;

                self.connectedPeripheral = [[BLEManager manager] getConnectedPeripheral];
                self.connectedPeripheral.delegate = self;

                if (self.connectedPeripheral && self.connectedPeripheral.state == CBPeripheralStateConnected)
                {
                    [self.connectedPeripheral discoverServices:@[sUUID]];
                }
            }
            else NSLog(@"cUUID and sUUID are mandatory");
        }

        return self;
    }
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error
{
//    NSLog(@"didDiscoverServices");

    for (CBService *service in peripheral.services)
    {
        if ([service.UUID isEqual:self.sUUID])
        {
            [peripheral discoverCharacteristics:@[self.cUUID] forService:service];
        }
    }
}

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
{
    if (service.UUID.UUIDString.length >= 8)
    {
        for (CBCharacteristic *characteristic in service.characteristics)
        {
            if ([characteristic.UUID isEqual:self.cUUID])
            {
                if (self.accessType == PeripheralAccessTypeRead)
                {
                    self.connectedCharacteristic = characteristic;
                    [peripheral setNotifyValue:YES forCharacteristic:characteristic];
                    [peripheral readValueForCharacteristic:characteristic];
                }
                else
                {
                    self.connectedCharacteristic = characteristic;
                    [peripheral setNotifyValue:YES forCharacteristic:characteristic];

                    unsigned char dat = self.valueToSet;
                    NSLog(@"dat %i", dat);
                    NSData * valueData = [NSData dataWithBytes:&dat length:1];

                    NSLog(@"valueData %@",valueData);

                    [peripheral writeValue:valueData forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];
                }
            }
        }
    }
}

- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
{
    if (error)
    {
        NSLog(@"%@",error.localizedDescription);
    }
    else
    {
        NSString * characteristicName = [self getCharacteristicName:characteristic];
        NSData * value = [self readValueFromCharacteristic:characteristic];

        NSLog(@"update %@: %@",characteristicName ,value);

       self.completionBlock(value);
    }
}

谢谢

什么
外围设备管理器
对象?看起来,
peripheraldmanager
是一个类,您正在调用一个类方法。此外,如果块引用了对象并且复制了该块,则该块将保留对该对象的强引用。所以,你对为什么你认为崩溃正在发生的解释似乎不太可能。你在用ARC吗?(在ARC下,块始终复制到堆中。)如果不是,则如果保持完成块超过其定义上下文,是否复制完成块?在任何情况下,请显示代码并显示崩溃详细信息。+-[readValue…]的实现应-[copy]块位于MRC下,或将其存储在ARC下的copy属性/strong ivar中。peripheralManager本身的生命周期取决于其所有者(此处未显示)。正如Ken指出的,诊断可能是错误的。我用实现代码@Kenthomase编辑了这个问题