我有一个名为 toolbarButtons
的 NSArray
属性,在一个实例中(当 UIViewController
是模式时)它需要是一个 NSMutableArray
,当 UIViewController
是非模态的时,它只需是一个 NSArray
。
我已经像这样初始化了属性:
@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
我知道有很多解决方法,但从设计的角度来看,我只是想知道我正在做的事情是否可行以及如何纠正我的错误。
最佳答案
@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 之外,您的另一个选择是使用强大的属性并自己处理副本。
关于iphone - 将 NSMutableArray 存储在 NSArray 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11162257/