1

シングルトンオブジェクトにモックデータを入力して、このすべてのデータが入る配列を返す関数を吐き出します。

@interface menuItem : NSObject {
//Item's Name
NSString *itemName;
//String of Prices - "$4.50" or "$1.50 / $2.50 / $3.50"
NSArray *priceList;
//List of Ingredients 
NSArray *ingredientList;
//List of adjusted Quantities
NSArray *ingredientQuants; 
//Number of Sizes for corresponding prices
int numOfSizes;
}
- (NSString *)priceText;
@property (nonatomic, copy) NSString *itemName;
@property (nonatomic, copy) NSArray *priceList;
@property (nonatomic, copy) NSArray *ingredientList;
@property (nonatomic, copy) NSArray *ingredientQuants;
@property (nonatomic, assign) int numOfSizes;
@end

オブジェクトは、componentQuantsに値が格納されているmenuItemsを使用してオブジェクトをいくつ入れてもかまいませんが、いくつかの宣言を行うと、stashする直前に宣言された変数を使用しても、componentQuantsを宣言したオブジェクトを許可することにうんざりします。そこでそれらを実行し、main.cでEXEC_BAD_ACCESSを実行することを決定します。

-(NSArray *)returnAllItems {
  return items;
}

- (void) loadMenu { 
   if(categories && items){ 
     return;
}
categories = [[NSArray alloc] initWithObjects:@"Coffee", @"Coffee Alternatives", @"Smoothies", @"Baked Goods", @"Sandwiches",@"Salads", nil];

NSArray *nyQuants = [[NSArray alloc] initWithObjects:@"No", @"Yes", nil];
//NSArray *ynQuants = [NSArray arrayWithObjects:@"Yes", @"No", nil];
NSArray *numQuants = [[NSArray alloc] initWithObjects:@"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"0", nil];
NSArray *espressoIList = [[NSArray alloc] initWithObjects:@"Decaf", @"Iced", @"Soymilk", @"Shots",nil];

menuItem *menuitemOne = [[menuItem alloc] init];
menuitemOne.itemName = @"Regular Coffee";
menuitemOne.priceList = [NSArray arrayWithObjects:@"$1.50",@"$1.95",@"$2.15", nil];
menuitemOne.numOfSizes = 3;
// menuitemOne.ingredientList = [NSArray arrayWithObjects:@"Decaf", @"Iced", nil];
//menuitemOne.ingredientQuants = [NSArray arrayWithObjects:nyQuants, nyQuants, nil];

menuItem *menuItemTwo = [[menuItem alloc] init];
menuItemTwo.itemName = @"Latte";
menuItemTwo.priceList = [NSArray arrayWithObjects:@"$2.55", @"$3.45", @"$3.75", nil];
menuItemTwo.numOfSizes = 3;
menuItemTwo.ingredientList = espressoIList;
menuItemTwo.ingredientQuants = [NSArray arrayWithObjects:nyQuants, nyQuants, nyQuants, numQuants, nil];

menuItem *mocha = [[menuItem alloc]init];
mocha.itemName = @"Mocha";
mocha.priceList = [NSArray arrayWithObjects:@"$3.15",@"$3.95",@"$4.75", nil];
mocha.numOfSizes = 3;
mocha.ingredientList = espressoIList;    
//THIS LINE BREAKS THE ENTIRE PROGRAM
NSArray *aaaa = [NSArray arrayWithObjects:@"ASD", @"DFG", nil];
mocha.ingredientQuants = [NSArray arrayWithObjects:aaaa, nil];

//上記のように多くのスタッフが発生します

items = [NSArray arrayWithObjects:coffeeArray, espressoArray,smoothieArray, bakedArray, sandwichArray,saladArray, nil];

[nyQuants release];
[numQuants release];
[espressoIList release];

NSLog(@"Categories: %d", [categories retainCount]);
NSLog(@"items: %d", [items retainCount]);
NSLog(@"nyQuants: %d", [nyQuants retainCount]);
NSLog(@"numQuants: %d", [numQuants retainCount]);
NSLog(@"espresslist: %d", [espressoIList retainCount]);

}

次に、このオブジェクトを初期化し、そのメンバー配列を取得して、ビューコントローラーに配置します。

        CBMenu *WholeMenu = [CBMenu sharedInstance];
    NSLog(@"MENU");
    NSArray *cats = [WholeMenu returnCategories];
    NSLog(@"Cats");
    NSArray *menu = [WholeMenu returnAllItems];
    NSLog(@"Menu");

    //What are these I don't even
    [cats retain];
    [menu retain];

    FoodMenuTwoViewController *mmvc = [[FoodMenuTwoViewController alloc]initWithData:cats :NO: YES];
    [mmvc setDataSource:cats];
    [mmvc setMenu:menu];
    [mmvc setTitle:@"Menu"];
    [self.navigationController pushViewController:mmvc animated:YES];

    //FOR SOME REASON IT DOESN'T LIKE ME RELEASING CATS AND MENU OR REMOVING THEIR
    //RETAIN STATEMENTS ABOVE PLEASE DON'T HURT ME.

    return;

VCの最初のブール値がYESの場合、カテゴリのリストが表示されます。これはわかりますが、スタックにプッシュされたときにビューが表示されると、すべての臓器が吐き出されて死んでしまいます。

NSZombieEnabledは、CharlieBrown [4285:fb03] * -[__ NSArrayI hold]:割り当て解除されたインスタンス0x6e06550に送信されたメッセージを通知します

4

2 に答える 2

1

NSStrings と NSArrays のプロパティを保持する代わりにコピーするように設定し、init メソッドで [[NSArray alloc] initWithObjects:] を Ingredients List と espressoIList で使用しないでください。他の配列では使用しないでください (これは正しいです)。そうしないと、メモリリークが発生します。他のほとんどの配列で行ったように、NSArray arrayWithObjects を使用します。

編集:

これも変更

menuItemTwo.ingredientList = espressoIList;

menuItemTwo.ingredientList = [NSArray arrayWithArray: espressoIList ];

編集:

これらの調整を行うのに役立たなかったと言うので、//more lik this で示したコードを投稿してください。

なぜ問題が発生するのか、まだわかりません。クラッシュの原因となっている行はどれですか? これです?

mocha.ingredientQuants = [NSArray arrayWithObjects:nyQuants, nil];

そして、あなたがそれを省略しても、それはうまくいきますか?

編集:

mocha 配列に追加しようとしたときに nyQuants がリリースされたようです。autoreleasepool が空になり、オブジェクトが消えるように見えますが、実行ループの後にのみ発生すると思いました。alloc init を使用して依存する nyQuants およびその他の配列を初期化し、すべての menuItems の宣言が完了した後に手動で解放してみてください。そうすべきだと思います!

だから、それらを変更してください

NSArray *nyQuants = [NSArray arrayWithObjects:@"No", @"Yes", nil];
NSArray *ynQuants = [NSArray arrayWithObjects:@"Yes", @"No", nil];
NSArray *numQuants = [NSArray arrayWithObjects:@"1", @"2", @"3", @"4", @"5", @"6",     @"7", @"8", @"0", nil];
NSArray *espressoIList = [[NSArray alloc] initWithObjects:@"Decaf", @"Iced", @"Soymilk", @"Shots",nil];

espressoIList のように割り当てられるものはすべてこの例にあり、メソッドが戻る前にそれらを解放します。

于 2012-05-03T08:06:57.290 に答える