0

Ordered NSMapTable の iOS には Collection がないため (そもそもなぜコレクションが必要なのか長い話:))、それをサブクラス化し、自分で実装しようとしました。

残念ながら、私はいくつかの奇妙な問題に直面しています:

プロパティを追加したり、init メソッドをオーバーライドしたりすることさえできません。

私はいつも例外でプロンプトが表示されます:

キャッチされない例外: -[NSConcreteMapTable setKeyIndexArray:]: 認識されないセレクターがインスタンスに送信されました

ここに私のコードがあります:

OrderedMapTable.h :

@interface OrderedMapTable : NSMapTable

-(id) objectAtIndex:(NSUInteger)index;

-(id) keyAtIndex:(NSUInteger)index;

@end

OrderedMapTable.m :

@interface OrderedMapTable()

@property (nonatomic, strong) NSMutableArray* keyIndexArray;

@end


@implementation OrderedMapTable


+(id)strongToStrongObjectsMapTable
{
    OrderedMapTable* orderedMapTable = [super strongToStrongObjectsMapTable];
    orderedMapTable.keyIndexArray = [[NSMutableArray alloc] init];
    return orderedMapTable;
}

...
@end
4

1 に答える 1

0

これが、Cocoa コレクション クラスをサブクラス化してはならない理由です。(ちなみに、例外メッセージはかなり明確で意味のある英文です。読んで理解してください。

OrderedMapTable* orderedMapTable = [super strongToStrongObjectsMapTable];

これはsuper- を呼び出しNSMapTableます。これは、もちろんプロパティを持たない独自のサブクラスのインスタンスではなく、のインスタンスを作成しkeyIndexArrayます。

self考えられる解決策:作成されたインスタンスで指定されたイニシャライザを 割り当てて呼び出します。

OrderedMapTable *map = [[self alloc] initWithKeyOptions: NSMapTableStrongMemory valueOptions: NSMapTableStrongMemory capacity:0];

あなたが言及したように、上記を無視してください。機能しません。initWithKeyOptions:valueOptions:capacity:メソッドは常にプライベートサブクラスのインスタンスを作成します。あなたがそれについてできることはあまりありません。基本的に、サブクラス化は忘れてください。

于 2013-05-23T07:30:00.797 に答える