NSMutableArray遇到问题__NSArrayI removeObjectAtIndex:]:无法识别的选择器

时间:2012-10-11 18:06:54

标签: ios nsmutablearray nsarray variable-assignment retain

我已经看过其他SO讨论但似乎无法找到答案。我基本上在以下代码后得到了这个答案:

1)在拥有AwesomeMenu的类中,我正在创建一个AwesomeMenuItems的NSMutableArray,这是初始化AwesomeMenu所必需的:

NSMutableArray *menus = [[[NSMutableArray alloc] init] autorelease];
[menus addObject:starMenuItem1];
[menus addObject:starMenuItem2];
[menus addObject:starMenuItem3];
[menus addObject:starMenuItem4];
[menus addObject:starMenuItem5];

AwesomeMenu *menu = [[[AwesomeMenu alloc] initWithFrame:self.view.bounds menus:menus view:self.view] autorelease];

2)在AwesomeMenu.h中,我在接口中声明了数组,如下所示:

NSMutableArray *_menusArray;

我为数组创建了一个属性:

@property (nonatomic, retain) NSMutableArray *menusArray;

它是合成的:

@synthesize menusArray = _menusArray;

3)在initWithFrame:menus:view:中,我分配了如下菜单参数:

- (id)initWithFrame:(CGRect)frame menus:(NSMutableArray *)aMenusArray view:(UIView*)gView
{
    self = [super initWithFrame:frame];
    // ... some code
    self.menusArray = aMenusArray; // BREAKPOINT HERE.
    // ... some more code
}

4)我在作业中放了一个断点,这就是发生的事情。在该行运行之前,我检查我的self.menusArray,它是:(NSMutableArray *)0x00000000 0对象

我跨过界线,它变成: (__NSArrayI *)0x06045070 5个对象。

虽然这是正确的对象数量,但它不再是NSMutableArray,它会让我以后遇到问题!

发生了什么以及如何阻止它发生?

2 个答案:

答案 0 :(得分:0)

__ NSArrayI它是inmutable数组,你传递给initWithFrame方法NSArray,而不是NSMutable数组

解决方案:

self.menusArray = [NSMutableArray arrayWithArray:aMenusArray]; // BREAKPOINT HERE.

答案 1 :(得分:0)

检查AwesomeMenu.h文件中的以下声明。确保您也将NSArray更改为NSMutableArray。这也可能导致这个问题。

- (id)initWithFrame:(CGRect)frame menus:(NSMutableArray *)aMenusArray view:(UIView*)gView;

<强>更新 只是一张纸条。在init方法中,在为self分配内存后,请始终使用以下内容。

if (self) {
   //code goes here
}

<强> UPDATE2: 同时将self.menusArray = aMenusArray;更改为_menusArray = [aMenusArray retain]

根据Apple文档,您不应在self.paraminit方法中使用dealloc,因为它处于内存分配/销毁过程中尚未完成。