以下问题:我从框架(不可实例化)收到一个Object,我想扩展它。当我创建一个类别时,问题是,它对现有对象没有影响。
我想到的是调皮。因此,让isa字段指向扩展的选择器列表"。但这似乎不可能吗? (它的语法?)
有没有人知道更好的方法呢?
这就是代码:
- (void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveWriteRequests:(NSArray<CBATTRequest *> *)requests {
//want to do something that uses the extension
}
我想扩展CBATTRequest。我认为问题在于CoreBluetooth?
这就是我制作类别的方式:
BLERequestable.h
@protocol BLERequestable <NSObject>
- (nonnull NSString *)getCentralUUID;
- (nonnull NSString *)getCharacteristicUUID;
- (nullable NSData*)getData;
- (void)setData:(nullable NSData *) data;
@end
CBATTRequest + Requestable.h
#import <CoreBluetooth/CoreBluetooth.h>
#import "BLERequestable.h"
@interface CBATTRequest (Requestable) <BLERequestable>
@end
CBATTRequest + Requestable.m
#import "CBATTRequest+Requestable.h"
@implementation CBATTRequest (Requestable)
- (NSString *)getCentralUUID {
return self.central.identifier.UUIDString;
}
- (NSString *)getCharacteristicUUID {
return self.characteristic.UUID.UUIDString;
}
- (NSData*)getData {
return self.value;
}
- (void)setData:(NSData *) data {
self.value = data;
}
@end
我在所有想要使用它的地方导入类别。
答案 0 :(得分:0)
经过长时间的研究和测试(感谢Rob Napier),我发现了错误的根源。
我的项目包含一个库和可执行目标。在库中我定义了我的类别并在里面使用它。问题是,当由于可执行文件而导致链接时,我的类别的o文件没有链接。见this stack post for further details on problems with categories in static libraries。
一种可能的解决方案是将链接器标志从exe目标设置为-Objc。
但我不喜欢这个解决方案,因为图书馆正常工作的能力取决于exe。
所以我在我使用它的m文件中包含了类别的实现。
如果有人有另一个(更好的)解决方案,我会很高兴看到它。否则我会关闭这个问题。