0

私はすでに他のSOの議論を見てきましたが、答えが見つからないようです。基本的に次のコードの後に​​この答えを得ています:

1) AwesomeMenu を所有するクラスで、AwesomeMenu を初期化するために必要な、AwesomeMenuItems の NSMutableArray を作成しています。

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: で、次のように menus パラメータを割り当てます。

- (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 ではなくなりました。

何が起こっているのか、どうすればそれを止めることができますか?

4

2 に答える 2

0

AwesomeMenu.hファイル内の次の宣言を確認してください。も必ずそこに変更してNSArrayくださいNSMutableArray。それもこの問題を引き起こす可能性があります。

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

更新: メモ。initメソッドでは、自分自身にメモリを割り当てた後、常に次のものを使用します。

if (self) {
   //code goes here
}

Update2: またself.menusArray = aMenusArray;に変更_menusArray = [aMenusArray retain]

アップルのドキュメントによると、まだ完了していないメモリの割り当て/破棄のプロセスにあるため、メソッドで使用self.paramすることは想定されていません。initdealloc

于 2012-10-11T18:16:04.590 に答える
0

__NSArrayI は不変配列です。initWithFrame メソッド NSArray に渡します。NSMutable 配列ではありません

解決:

self.menusArray = [NSMutableArray arrayWithArray:aMenusArray]; // BREAKPOINT HERE.
于 2012-10-11T18:10:06.720 に答える