0

我有一个属性NSArraytoolbarButtons在一个实例中(当它UIViewController是模态的)它需要是一个属性,当它是非模态NSMutableArrayUIViewController,它只需要是一个NSArray

我已经像这样初始化了属性:

@property (nonatomic, copy) NSArray *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] 总是返回一个不可变的 NSArray,即使 array 是一个 NSMutableArray。

@property ( nonatomic, copy ) NSMutableArray* array

处理方式有点不同:

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

在这种情况下,你可以做

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

并且数组将被分配一个 NSMutableArray,因为 mutableCopy 总是返回一个 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 回答