扩展现有的Object(ISA Swizzling?)

时间:2017-12-14 14:54:04

标签: objective-c runtime

以下问题:我从框架(不可实例化)收到一个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

我在所有想要使用它的地方导入类别。

1 个答案:

答案 0 :(得分:0)

经过长时间的研究和测试(感谢Rob Napier),我发现了错误的根源。

我的项目包含一个库和可执行目标。在库中我定义了我的类别并在里面使用它。问题是,当由于可执行文件而导致链接时,我的类别的o文件没有链接。见this stack post for further details on problems with categories in static libraries

一种可能的解决方案是将链接器标志从exe目标设置为-Objc。

但我不喜欢这个解决方案,因为图书馆正常工作的能力取决于exe。

所以我在我使用它的m文件中包含了类别的实现。

如果有人有另一个(更好的)解决方案,我会很高兴看到它。否则我会关闭这个问题。