可能重复:
self.ivar 和 ivar 之间的区别?
我最近遇到了一个问题,我试图初始化一个对象,其中涉及传递一个 NSMutableArray 进行赋值。
我试着做
- (id)initWithFrame:(CGRect)frame menus:(NSMutableArray *)aMenusArray view:(UIView*)gView
{
self = [super initWithFrame:frame];
if (self) {
// ...some code
_menusArray = [aMenusArray retain]; // This works
// _menusArray = aMenusArray; This does not work.
// self.menusArray = [aMenusArray retain]; This does not work.
// self.menusArray = aMenusArray; This does not work.
// ...some code
}
return self;
}
“不起作用”意味着当我稍后尝试将数组视为 NSMutableArray 并传递 [self.menusArray removeObjectAtIndex:0] 或类似的东西时,它不会导致 __NSArrayI 上使用的无法识别的选择器出现异常。换句话说,“不起作用”导致 self.menusArray 成为不可变数组而不是可变数组。
我想知道为什么 _menusArray = [aMenusArray retain] 有效,为什么其他无效。据我所知,属性和合成只是创建访问器方法(getter 和 setter)。我问了我的同事,他们回答说我可能在某个地方有一些损坏的记忆。
需要明确的是,aMenusArray 被声明为 NSMutableArray,而 _menusArray 在头文件中声明如下:
NSMutableArray *_menusArray;
它的属性和综合(在实现中)是:
@property (nonatomic, retain) NSMutableArray *menusArray;
@synthesize menusArray = _menusArray;