1

たとえば、次のコードがあります。

@interface LOSHeadlineMetricsService : NSObject {

    id<LOSHeadlineMetricsServiceDelegate>delegate;

}

プロトコルは次のようになります

@protocol LOSHeadlineMetricsServiceDelegate <NSObject>

- (void) serviceDidComplete;

- (void) serviceFailed;

@end

デリゲートのクライアントでの実行時に、リフレクションを通じてプロトコル「LOSHeadlineMetricsServiceDelegate」の名前をスローする例外を発生させたいと考えています。どうすればそれを達成できますか?

if (self.delegate == nil) {
   [NSException raise:@"NOT IMPLEMENTED" format:@"%s", Reflection(self.delegate)]
}
4

2 に答える 2

2

関数によって返されたプロパティ属性から解析できproperty_getAttributes()ます。プロパティのタイプは、最初の文字 ( 'T' と定義されている) と最初のコンマの間のテキストを調べることで判断できます。オブジェクト タイプの場合、このテキストは @"ClassName" の形式になります。id型プロパティには @ 記号のみが含まれ、引用符、クラス名、またはプロトコル名は含まれません。NSScannerあなたの好みが何であれ、ここでかなり効果的に、または正規表現を使用することができます。

プログラム例とその出力:

#import <Foundation/Foundation.h>
#import <objc/runtime.h>

@protocol MyProtocol <NSObject>
- (void)someMethod;
@end

@interface MyObject : NSObject
@property (strong) id<MyProtocol> implementor;
@end

@implementation MyObject
@end

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        objc_property_t property = class_getProperty([MyObject class], "implementor");
        const char *propertyAttributes = property_getAttributes(property);
        NSLog(@"property attributes = %s", propertyAttributes);
    }
    return 0;
}

プログラムの出力は

2013-03-28 16:39:17.401 PropertyReflection[56502:303] property attributes = T@"<MyProtocol>",&,V_implementor

ここで、Kevin Ballard が指摘するように、この動作は、T の後の@encode文字列がプロパティの型の文字列であると述べているドキュメントと矛盾していることに注意するのが賢明です。私がこれを書いたとき、私はそれが事実だと思っていました。ただし、確認したところ、の結果@encode(id<MyProtocol>)は実際には単に「@」であるため、自己責任で使用してください。確かに、その文字列を解析するコードは、正常に失敗する準備ができている必要があり、ミッション クリティカルなデータ抽出に依存してはなりません。この情報がどうしても必要というよりは利便性として望まれるのであれば、これは先に進むのに適していると思います。

于 2013-03-28T22:49:38.543 に答える
1

できません。obj-c オブジェクトの静的型情報は、コンパイル中に破棄されます。実行時にわかるのは、それが obj-c オブジェクトであることだけです (この場合の「それ」はプロパティ/ivar です)。


更新: Carl Veazey の回答は、情報が実際にプロトコルに存在することを示しています。そして、テストした後、私は同じことを見ています。ただし、これは完全に文書化されていないため、実際のコードでこれに依存しないことをお勧めします。

于 2013-03-28T22:14:02.443 に答える