2

私はプロパティを持っています:

@property(nonatomic, strong) IBOutletCollection(UIView) NSMutableArray *allOpposition;

これはIBで一連のサブビューに接続され、合成されます。後で私は持っています:

- (void)willRemoveSubview:(UIView *)subview
{
  [[self allOpposition] removeObject:subview]; // Crash occurs here.
  [super willRemoveSubview:subview];
}

反対のエンティティを表すビューを削除するときが来ると、次のエラーメッセージが表示されます。

-[__NSArrayI removeObject:]: unrecognized selector sent to instance 0x88211c0

オブジェクトはnilコレクションに含まれていません。なぜ私の配列は不変なのですか?

備考:UIViewこの場合、Appleはコレクション内の各オブジェクトがタイプである必要がある可能性があります。配列が完全に変更可能であれば、おそらく外部型を追加できます。私はここで多くのドキュメントを見つけていないので、これは私の側の推測です。

備考:返された配列が最終的に不変である場合に、可変配列を渡すことを許可することの価値はわかりません。不変の配列を受け入れないのはなぜですか?

4

1 に答える 1

4

プロパティを可変配列として宣言した可能性がありますが、nibがロードされると、不変配列が割り当てられると確信しています。

合成されたセッターをオーバーライドallOppositionします(xcode4.4以降とARCを使用していると想定しています)。

-(void)setAllOpposition:(NSMutableArray*)allOpposition
{
    _allOpposition = [allOpposition mutableCopy];
}

strongプロパティ宣言をからに変更することでこれを実現できる場合もありますがcopy、それは推測です。

于 2012-09-25T06:39:41.023 に答える