我正在用模拟数据填充一个单例对象,以便在返回所有这些数据进入的数组的函数中吐出。
@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
该对象并不关心我在其中放置了多少对象 menuItems 的值存储在 intriientQuants 中,但是在多次声明之后,它厌倦了让那些确实声明了 inminientQuants 的对象,即使使用在我将它们存储在那里之前声明的变量,然后它决定在 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 保留]:发送到已解除分配的实例的消息0x6e06550
将 NSStrings 和 NSArrays 的属性设置为复制而不是保留,并且在您的 init 方法中不要在您的成分列表和 espressoIList 上使用 [[NSArray alloc] initWithObjects:] - 您不会使用其他数组执行此操作(这是正确的(。否则会出现内存泄漏。使用 NSArray arrayWithObjects,就像使用大多数其他数组一样。
编辑:
也改变这个
menuItemTwo.ingredientList = espressoIList;
自
menuItemTwo.ingredientList = [NSArray arrayWithArray: espressoIList ];
编辑:
既然你说它没有帮助你进行这些调整,也许发布代码你用//更喜欢这个
我真的不明白你为什么会遇到这个问题。导致崩溃的线路是哪条线?这个?
mocha.ingredientQuants = [NSArray arrayWithObjects:nyQuants, nil];
如果你把它排除在外,它就会起作用吗?
编辑:
在我看来,当您尝试将其添加到摩卡数组时,nyQuants 就被释放了。似乎自动释放池被排空并且对象消失了 - 尽管我认为这只会在运行循环之后发生。尝试使用 alloc init 对您的 nyQuants 和其他您依赖的数组进行数字化,并在完成所有菜单项的声明后手动释放它们。我认为应该这样做!
所以,改变那些
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 一样分配的内容,并在方法返回之前释放它们。
如果您收到发送到已解除分配实例的 NSArray - 消息,则意味着您正在使用具有负保留计数的变量,您以某种方式删除/释放了它。
在头文件中,您使用 (nonatomic, retain)
声明数组,这意味着它们的保留计数为 1。在 m 文件中,您应该在 - (void)dealloc{}
方法中释放数组。您使用 arrayWithObjects 方法初始化了数组,并且根据 apple 内存管理说明,使用此方法您不拥有这些对象,因此您无法释放/删除/删除它们。