2

のサブクラスを作りたいNSNotificationカテゴリなどを作成したくありません。

ご存知かもしれませんNSNotificationが、やのようなクラス クラスタです。NSArrayNSString

クラスター クラスのサブクラスが次のことを行う必要があることは承知しています。

  • 独自のストレージを宣言する
  • スーパークラスのすべての初期化メソッドをオーバーライドする
  • スーパークラスのプリミティブ メソッドをオーバーライドします (後述)。

これは私のサブクラスです(派手なものはありません):

@interface MYNotification : NSNotification
@end

@implementation MYNotification

- (NSString *)name { return nil; }

- (id)object { return nil; }

- (NSDictionary *)userInfo { return nil; }

- (instancetype)initWithName:(NSString *)name object:(id)object userInfo:(NSDictionary *)userInfo
{
    return self = [super initWithName:name object:object userInfo:userInfo];
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
    return self = [super initWithCoder:aDecoder];
}

@end

私がそれを使用すると、私は異常な結果を得る:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** initialization method -initWithName:object:userInfo: cannot be sent to an abstract object of class MYNotification: Create a concrete instance!'

から継承するには他に何をしなければなりませんNSNotificationか?

4

1 に答える 1

2

問題は、スーパークラスの初期化子を呼び出そうとしていたことです。は抽象クラスであるため、それを行うことはできません。したがって、イニシャライザでは、ストレージを初期化するだけです。

これはひどいので、NSNotification代わりにカテゴリを作成することになります。そこに 3 つの種類のメソッドを追加しました。

  • カスタム通知の静的コンストラクター: ここではuserInfo、ストレージとして使用するように構成します。
  • ストレージに情報を追加するメソッド: 通知オブザーバーはこれを呼び出して update しuserInfoます。
  • オブザーブによって送信された情報を処理するメソッド: post メソッドが終了すると、通知は必要なすべての情報を収集します。処理して返送するだけです。データの収集に関心がない場合、これはオプションです。

結局のところ、カテゴリを扱うのは単なるヘルパーuserInfoです。

@Paulw11コメントありがとうございます!

于 2015-02-06T19:09:34.597 に答える