0

可能重复:
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;
4

1 回答 1

1

在您的 init 方法中使用点表示self法会导致意外行为。有关更多详细信息,请参阅初始化属性、点表示法

于 2012-10-15T16:50:22.877 回答