0

NSMutableArrayにAddObjectを追加しようとすると、ここで "-[__ NSArrayI addObject:]:認識されないセレクターがインスタンス0x10dd15ee0"に送信されます。理由はわかりません。

ネストされたカスタムクラスのセットがあります。WTEventには、WTMatオブジェクトで構成されるmatsと呼ばれるNSMutableArrayプロパティがあります。matsには、boutsと呼ばれるWTBoutオブジェクトのNSMutableArrayがあります。

残りの試合をそのままにして、試合の1つの試合を更新できるようにしたいと思います。ここでは、試合を割り当てる必要があるマットを見つけます。初期化されていない場合は、初期化します。次に、空の場合、newBoutを追加しようとすると、クラッシュします。

このようにNSMutableArrayの要素を変更することはできませんか?

// Locate the correct mat
WTMat* mat = [self getMatFromBoutKey:[updateData valueForKey:@"boutKey"]];
WTBout* newBout = [WTBout buildBoutFromDictionary:updateData];

// need to initialize bouts
if ([mat bouts] == nil) {
    NSLog(@"Initializing bouts");
    NSMutableArray* newBouts = [[NSMutableArray alloc] init ];
    [mat setBouts:newBouts];
}

if ([[mat bouts] count]) {
    // if bouts has bouts, then adjust the bout stack

    NSLog(@"bouts is not empty");
} else {
    // if bouts is empty, just add a bout

    NSLog(@"Adding a newBout");
    NSMutableArray* oldBouts = [mat bouts];
    NSLog(@"oldbouts: %@", [oldBouts description]);
    [oldBouts addObject:newBout]; // -[__NSArrayI addObject:]: unrecognized selector sent to instance 0x10dd15ee0

}

WTMat.h:

#import <Foundation/Foundation.h>

@interface WTMat : NSObject
{
    NSString* matName;
    NSString* boutKey;
    NSString* multicastAddress;
    NSMutableArray* bouts;
}

@property (strong, nonatomic) NSString* matName;
@property (strong, nonatomic) NSString* boutKey;
@property (strong, nonatomic) NSString* multicastAddress;
@property (copy, nonatomic) NSMutableArray* bouts; 

@end

ログ:

2012-05-12 08:14:00.491 Wrestling Tools[12623:403] Initializing bouts
2012-05-12 08:14:00.492 Wrestling Tools[12623:403] Adding a newBout
2012-05-12 08:14:00.492 Wrestling Tools[12623:403] oldbouts: (
)
2012-05-12 08:14:00.492 Wrestling Tools[12623:403] -[__NSArrayI addObject:]: unrecognized selector sent to instance 0x10dd15ee0
2012-05-12 08:14:00.492 Wrestling Tools[12623:403] -[__NSArrayI addObject:]: unrecognized selector sent to instance 0x10dd15ee0
2012-05-12 08:14:00.494 Wrestling Tools[12623:403] (
    0   CoreFoundation                      0x00007fff96783fc6 __exceptionPreprocess + 198
    1   libobjc.A.dylib                     0x00007fff92375d5e objc_exception_throw + 43
    2   CoreFoundation                      0x00007fff968102ae -[NSObject doesNotRecognizeSelector:] + 190
    3   CoreFoundation                      0x00007fff96770e73 ___forwarding___ + 371
    4   CoreFoundation                      0x00007fff96770c88 _CF_forwarding_prep_0 + 232
    5   Wrestling Tools                     0x000000010dc49343 -[WTUpdater fullUpdate:] + 835
4

3 に答える 3

5

これがあなたの問題です:

@property (copy, nonatomic) NSMutableArray* bouts; 

「copy」パラメーターは、配列の不変のコピーを作成します。これは、この行が実行されるときを意味します。

NSMutableArray* oldBouts = [mat bouts];

実際には通常NSArrayのが発生しているため、認識されないセレクターエラーが発生します。

これに対する簡単な解決策は、「copy」キーワードを「strong」に変更することです。コピーのままにしておくのは少し難しいですが、代わりにプロパティのタイプをNSArrayに変更すると、配列の変更が複雑になります。

最後に、メソッドをsetBouts:使用してコピーを実行する独自の実装を作成し、作成-mutableCopyするコピーが変更可能であることを確認できます。

于 2012-05-12T13:54:59.457 に答える
0

Alloc itがすべてだと思いますNSMutableArray* oldBouts = [mat bouts];。そして、何が起こるか見てみましょう。

于 2012-05-12T13:45:11.953 に答える
-1

@dynamicを使用してプロパティを初期化してみてください。非常によく似た答えが役立つかもしれません。

于 2012-05-12T14:04:49.860 に答える