iphone - 将 NSMutableArray 存储在 NSArray 中?

标签 iphone objective-c ios cocoa-touch design-patterns

我有一个名为 toolbarButtonsNSArray 属性,在一个实例中(当 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/

相关文章:

iphone - UI事件指示器

iphone - iOS - 如何实现UILabel上文字的浮雕效果?

iphone - NSDateFormatter 问题

php - 无法在图像上传中将变量传递给PHP脚本

iphone - 分组 UITableView 和编辑模式 : strange behaviour

iphone - 如何禁用“向下拖动以查看通知”功能?

Objective-C:在哪里删除 NSNotification 的观察者?

objective-c - 在 Interface Builder 中创建的 UIBarButtonItem 不起作用 - 困惑

ios - 无法在 Firebase API 回调 block 中的函数内赋值

ios - Xcode 5 IOS 7 错误 : failed to launch '/private/var/mobile/Applications/' -- NotFound