我已经看过其他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,它会让我以后遇到问题!
发生了什么以及如何阻止它发生?
答案 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.param
和init
方法中使用dealloc
,因为它处于内存分配/销毁过程中尚未完成。