0

iPad 6.1 シミュレーターを使用していますが、別のオブジェクトを IBOutletCollection に追加しようとすると、エラーが発生する理由がわかりません。

__NSArrayI addObject: 認識されないセレクターがインスタンスに送信されました。

テスト プロジェクトをセットアップし、次のように証明しました。

ViewController.m

@interface ViewController ()

@property (strong, nonatomic) IBOutletCollection(UILabel) NSMutableArray *collection;

@property (strong, nonatomic) NSMutableArray *collection2;

@end

@implementation ViewController

-- (void)viewDidLoad
{

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.
    UILabel *label = [[UILabel alloc]init];

    // Test 1 - Pass
    NSMutableArray *array = [[NSMutableArray alloc]init];
    [array addObject:label];

    // Test 2 - Pass
    _collection2 = [[NSMutableArray alloc]init];
    [self.collection2 addObject:label];



    // Test 3 - Fails   
    [self.collection addObject:label];

}

@end

テスト 3 の直前に a を実行するlldb:p self.collectionと 、(NSMutableArray *) $0 = 0x071817b0 @"3 objects"

それが参照している 3 つのオブジェクトは、私が IB 経由で接続したものです。どういうわけか、XCode 4.3.2 は嘘をついていて、コレクションは NSArray でなければならないと思います。

私も[_collection addObject:label]同じ結果で試しました。

この件に関するご意見は大歓迎です。

4

3 に答える 3

2

エラー メッセージを確認すると、

__NSArrayI addObject: 認識されないセレクターがインスタンスに送信されました

__NSArrayI とは何ですか?

__NSArrayIは不変配列 (NSArray) のコードワードです。

つまり、このエラーは、NSArray の addObject: メソッドを呼び出していることを示しています。NSArray には addObject: メソッドがありません。

何か問題が発生しました。

self.collectionは、NSMutable 配列ではなく、NSArray になりました。NSArray を self.collection に割り当てているか、self.collection を NSArray として再初期化した可能性があります。

コードを再確認してください。

于 2013-05-06T19:22:58.277 に答える
0
-(void)setCollection:(NSMutableArray*)collectionParm {
    _collection = [collectionParm mutableCopy];
}
于 2013-05-06T21:07:55.780 に答える
0

ブレークポイントを追加した場合を除いて、あなたと同じ動作が得られます。

$0 = 0x07199520 <__NSArrayI 0x7199520>

ドキュメントには、NSArrayまたはNSMutableArrayの前でIBOutletCollectionを使用できると記載されていますが、NSMutableArray宣言が機能しないようです。viewDidLoad の次の行で問題を解決できることがわかりました。

self.collection = [self.collection mutableCopy];
于 2013-05-06T20:14:41.147 に答える