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 preserve] が機能し、他の機能が機能しないのか疑問に思っていました。私が知る限り、プロパティと合成はアクセサー メソッド (ゲッターとセッター) を作成するだけです。同僚に尋ねたところ、おそらくどこかで破損したメモリがあるとのことでした。

明確にするために、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 に答える