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编辑了这个问题