1

BOOL プロパティの注入に問題があります。

私は次に試しました:

- (id)emotionControllerWithItem:(MDDiaryItem *)item firstController:(BOOL)isFirst
{
    return [TyphoonDefinition withClass:[MDEmotionViewController class]
                          configuration: ^(TyphoonDefinition *definition) {
                [definition useInitializer:@selector(initWithAnalytics:) parameters: ^(TyphoonMethod *initializer) {
                    [initializer injectParameterWith:[_services analytics]];
                }];
                [definition injectProperty:@selector(setItem:) with:item];
                [definition injectProperty:@selector(setFirstController:) with:[NSNumber numberWithBool:isFirst]];
            }];
}

しかし、実行時にクラッシュしますEXC_BAD_ACCESS。実際には BOOL プロパティではなく、値自体を持つインジェクション プロパティです。使用法についての私の仮定Typhoonが間違っているようです。

4

2 に答える 2

4

ランタイム引数は常にオブジェクトでなければなりません - プリミティブ型ではありません!

正しいアセンブリは次のとおりです。

- (id)emotionControllerWithItem:(MDDiaryItem *)item firstController:(NSNumber *)isFirst
{
    return [TyphoonDefinition withClass:[MDEmotionViewController class]
                          configuration: ^(TyphoonDefinition *definition) {
                [definition useInitializer:@selector(initWithAnalytics:) parameters: ^(TyphoonMethod *initializer) {
                    [initializer injectParameterWith:[_services analytics]];
                }];
                [definition injectProperty:@selector(setItem:) with:item];
                [definition injectProperty:@selector(setFirstController:) with:isFirst];
            }];
}

firstController プロパティには BOOL を指定できますが、アセンブリ インターフェイスを呼び出すときは、NSNumber ラッパーを使用する必要があります。

[assembly emotionControllerWithItem:item firstController:@YES];
于 2014-07-03T10:53:27.340 に答える
1

通常、次のように注入できます。

[definition injectProperty:@selector(isFirst) with:[NSNumber numberWithBool:YES]];

しかし、おそらくより良い:

[definition injectProperty:@selector(isFirst) with:@(YES)];

ただし、ランタイム引数には次の制限があります。

  • ランタイム引数でメソッドを呼び出すことはできません。
  • ランタイム引数をプリミティブにすることはできません。

これを回避するか、アセンブリ インターフェイスの代わりに使用する独自のファクトリ クラスの作成に戻ることができます。

@Aleksey による回答は、回避策を示しています。

于 2014-07-03T10:24:44.667 に答える