2012-06-22 118 views
0

我有一个属性的NSArray属性调用toolbarButtons在一个实例(当UIViewController是模态)它需要一个NSMutableArray,当UIViewController就是非模态的,它需要仅仅是一个NSArray。如下在NSArray中存储NSMutableArray?

@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 

我知道这里有很多解决方法,但从设计的角度来看,我只是想知道我在做什么是可能的,以及如何纠正我的错误。

+6

只是想知道,为什么你不使用一个NSMutableArray整个时间? – Vervious

+0

@vervious - 因为有时会创建一个工具栏,我知道它永远不会改变。当你不需要它时,设计一个NSMutableArray是不是很糟糕? –

回答

3
@property (nonatomic, copy) NSArray* array 

指:

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

[阵列拷贝]总是返回一个非可变的NSArray,即使阵列是的NSMutableArray。

@property (nonatomic, copy) NSMutableArray* array 

的处理方式稍有不同:

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

在这种情况下,你可以做

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

和阵列将与NSMutableArray的分配,如mutableCopy总是返回一个NSMutableArray。

后者当然强烈不鼓励。它现在工作。不保证它会永久工作。

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

0

在这种情况下铸造不起作用。您需要将属性更改为一个NSMutableArray:

@property (nonatomic, copy) NSMutableArray *toolbarButtons; 
0

你应该只使用一个NSMutableArray在你的财产,但你总是做这样的事情太...

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

    self.toolbarButtons = [NSArray arrayWithArray:mutArray]; 
1

你不能这样做!

当你:

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

你只是铸造的财产,这意味着你是有希望在运行时该属性是一个NSMutableArray的...但你在说谎!

我建议你做相反的:只需要声明它作为一个NSMutableArray的(这是NSArray中的一个子类,所以你可以使用它作为一个NSArray的,当你想要它),只是使用NSMutableArray的方法,当你需要他们