2017-12-14 9 views
0

問題:次の問題:フレームワーク(インスタンス化できないオブジェクト)を受け取って拡張したい。カテゴリを作るとき、問題はそれが既存のオブジェクトに影響を与えないということです。既存のオブジェクトを拡張する(ISAスウィズリング?)

私はイザスウィズルのことを考えました。だから、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 

そして私は輸入しますカテゴリはどこでも私はそれを使用したい。

+3

「拡張する」と言うときは、「メソッドを追加する」という意味ですか、「既存のメソッドは何を変更するのですか」という意味ですか?前者はカテゴリの機能であり、問​​題がある場合はコードとエラーを表示します。後者はスウィージングで行うことができますが、非常に危険であり、動作しないケースや、動作しているように見えるかもしれないが微妙に壊れているケース、OSのあるバージョンで動作し、それ以降のバージョンではプロダクションコードでは、これを強く避けるべきです。 –

+0

私はそれにメソッドを追加したいと思います。あなたは正しいです、@ RobNapier。通常、拡張機能を使用する必要があります。この場合、それはしません。私はいくつかのコードで自分の投稿を編集しました。 – MagicMaik

+0

カテゴリーをCBATTRequestにどのように追加していますか? '@interface CBATTRequest(MyExtension)'と '@implementation CBATTRequest'とあなたのコードでなければなりません。それはうまくいくはずです。 –

答えて

0

(Rob Napierのおかげで)長い研究とテストの結果、私はエラーの原因を発見しました。

私のプロジェクトは、ライブラリと実行可能なターゲットで構成されています。ライブラリで私は自分のカテゴリーを定義し、それを内部で使用しました。問題は、実行可能ファイルのためにリンクすると、私のカテゴリのoファイルがリンクされていないということです。 this stack post for further details on problems with categories in static librariesを参照してください。

可能な解決策の1つは、exeターゲットからリンカーフラグを-Objcに設定することです。

しかし、私がこのソリューションを気に入らないのは、ライブラリの機能が正しく動作するかどうかはexeファイルによって決まるからです。

私はそれを使用するmファイルにカテゴリの実装を含めました。

誰かが別の(より良い)解決策を持っていると、私はそれを見てうれしいです。さもなければ私はこの質問を閉じるだろう。

関連する問題