0

あるインスタンス(モーダルの場合)では、である必要があり、非モーダルの場合は、単に。である必要があるというプロパティがありNSArrayます。toolbarButtonsUIViewControllerNSMutableArrayUIViewControllerNSArray

私はこのようにプロパティを初期化しました:

@property (nonatomic, copy) NSArray *toolbarButtons;

次のようにtoolbarButtonsを初期化しています。

- (void) setToolbarButtons 
{
        UIBarButtonItem *exitButton = [[UIBarButtonItem alloc] initWithTitle:@"Exit" style:UIBarButtonItemStyleBordered target:self action:@selector(exitButtonPushed)];

        toolbarButtonsTemp = (NSMutableArray *)[[NSMutableArray alloc] init];
        [(NSMutableArray*)toolbarButtonsTemp addObject:exitButton];
        self.toolbarButtons = toolbarButtonsTemp;

        [exitButton release]; 
}

その後、次のようなサブクラスで上記のメソッドをオーバーライドします。

- (void) setToolbarButtons 
{
    [super setToolbarButtons];

    UIBarButtonItem *leftFlexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
    UIBarButtonItem *toolButton = [[UIBarButtonItem alloc] initWithTitle:@"Tools" style:UIBarButtonItemStyleBordered target:self action:@selector(toolButtonPushed)];

    [(NSMutableArray*)self.toolbarButtons addObject:leftFlexibleSpace];
    [(NSMutableArray*)self.toolbarButtons addObject:toolButton];

    [toolButton release];
    [leftFlexibleSpace release];
}

次のエラーが発生します。

[__NSArrayI addObject:]: unrecognized selector sent to instance

これには多くの回避策があることは知っていますが、設計の観点からは、自分がやっていることは可能かどうか、そして自分の間違いをどのように修正するかを考えています。

4

4 に答える 4

3
@property ( nonatomic, copy ) NSArray* array

意味:

- (void) setArray: (NSArray*) array
{
    _array = [array copy];
}

[array copy] は、配列が NSMutableArray であっても、常に変更不可能な NSArray を返します。

@property ( nonatomic, copy ) NSMutableArray* array

は少し異なる方法で処理されます:

- (void) setArray: (NSMutableArray*) array
{
    _array = [array mutableCopy];
}

その場合、あなたはすることができます

self.array = (NSMutableArray*) [NSArray new];

mutableCopy は常に NSMutableArray を返すため、array には NSMutableArray が割り当てられます。

もちろん、後者は強く推奨されません。今のところ動作します。永久に動作する保証はありません。

NSMutableArray 以外の他の選択肢は、強力なプロパティを使用し、自分でコピーを処理することです。

于 2012-06-22T18:56:21.910 に答える
1

それをしてはいけない!

あなたがするとき:

 [(NSMutableArray*)self.toolbarButtons addObject:leftFlexibleSpace];
    [(NSMutableArray*)self.toolbarButtons addObject:toolButton];

プロパティをキャストしているだけです。これは、実行時にそのプロパティがNSMutableArrayであることを約束していることを意味します...しかし、あなたは嘘をついています!!!

逆のことをお勧めします。NSMutableArrayとして宣言し(NSArrayのサブクラスなので、必要なときにNSArrayとして使用できます)、必要なときにNSMutableArrayメソッドを使用します。

于 2012-06-22T18:49:19.637 に答える
0

この場合、キャストは機能しません。プロパティを NSMutableArray に変更する必要があります。

@property (nonatomic, copy) NSMutableArray *toolbarButtons;
于 2012-06-22T18:46:08.797 に答える
0

プロパティで NSMutableArray を使用する必要がありますが、いつでもこのようなことを行うこともできます...

 NSMutableArray *mutArray = [[NSMutableArray alloc] init];
    [mutaArray addObject:leftFlexibleSpace];
    [mutaArray addObject:toolButton];

    self.toolbarButtons = [NSArray arrayWithArray:mutArray];
于 2012-06-22T18:48:00.073 に答える