我有一个名为NSArraytoolbarButtons属性,在一个实例中(当UIViewController是模态时)它需要是一个NSMutableArray,而当UIViewController是非模态时,它只需是一个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


我知道有很多解决方法,但是从设计角度来看,我只是想知道我正在做的事情是否可行以及如何纠正我的错误。

最佳答案

@property ( nonatomic, copy ) NSArray* array


手段:

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


即使数组是NSMutableArray,[array copy]总是返回不可更改的NSArray。

@property ( nonatomic, copy ) NSMutableArray* array


处理方式略有不同:

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


在这种情况下,您可以

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


和数组将分配一个NSMutableArray,因为mutableCopy总是返回一个NSMutableArray。

强烈建议不要使用后者。现在可以使用。不保证它将永远有效。

除了NSMutableArray之外,您的另一选择是使用强属性并自己处理副本。

10-07 13:05
查看更多