Objective c 在太多对象中初始化某些值会使我的应用程序崩溃

Objective c 在太多对象中初始化某些值会使我的应用程序崩溃,objective-c,ios,singleton,Objective C,Ios,Singleton,我用模拟数据填充一个单例对象,并在一个函数中输出,该函数返回所有这些数据进入的数组 @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 adjuste

我用模拟数据填充一个单例对象,并在一个函数中输出,该函数返回所有这些数据进入的数组

@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
该对象不在乎我将多少对象与存储在ingredientQuants中的值的menuItems放在一起,但在多次声明之后,它对让那些确实声明了ingredientQuants的对象感到厌倦,即使在我将它们存储在那里之前声明了变量,然后它决定在main.c上执行坏访问

-(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]);

}
然后我初始化这个对象,获取它的成员数组并将它们放在viewcontroller中:

        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中的第一个bool为YES时,它会显示一个类别列表。我看到了这一点,但当视图被推到堆栈上时,它会继续呕吐所有器官并死亡


NSZombieEnabled告诉我CharlieBrown[4285:fb03]*-[\uu NSArrayI retain]:发送到已解除分配实例0x6e06550的消息设置NSStrings和NSArrays的属性为copy而不是retain,并且在您的init方法中,不要在配料列表和浓缩咖啡列表上使用[[NSArray alloc]initWithObjects:],您不会对其他数组执行此操作(这是正确的)。否则会出现内存泄漏。请使用NSArray arrayWithObjects,就像使用大多数其他阵列一样

编辑:

也要改变这一点

menuItemTwo.ingredientList = espressoIList;

编辑:

既然你说这对你做这些调整没有帮助,也许可以发布代码 你用//表示得更像这样

我真的不明白你为什么会遇到这个问题。是哪条线导致了这次撞车? 这个

mocha.ingredientQuants = [NSArray arrayWithObjects:nyQuants, nil];
如果你不考虑它,它会起作用吗

编辑:

在我看来,nyQuants是在你试图将其添加到摩卡阵列时发布的。 似乎自动释放池被耗尽,对象消失了——尽管我认为这只会发生在运行循环之后。 尝试使用alloc init初始化nyquant和其他依赖的数组,并在完成所有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一样分配的内容都在本例中,并在方法返回之前释放它们。

将NSStrings和NSArray的属性设置为复制而不是保留,并且在init方法中,不要在成分列表和espressoIList上使用[[NSArray alloc]initWithObjects:],您不会对其他数组执行此操作(这是正确的)。否则会出现内存泄漏。请使用NSArray arrayWithObjects,就像使用大多数其他阵列一样

编辑:

也要改变这一点

menuItemTwo.ingredientList = espressoIList;

编辑:

既然你说这对你做这些调整没有帮助,也许可以发布代码 你用//表示得更像这样

我真的不明白你为什么会遇到这个问题。是哪条线导致了这次撞车? 这个

mocha.ingredientQuants = [NSArray arrayWithObjects:nyQuants, nil];
如果你不考虑它,它会起作用吗

编辑:

在我看来,nyQuants是在你试图将其添加到摩卡阵列时发布的。 似乎自动释放池被耗尽,对象消失了——尽管我认为这只会发生在运行循环之后。 尝试使用alloc init初始化nyquant和其他依赖的数组,并在完成所有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类似的配置都在本例中,并在方法返回之前释放它们。

如果您收到一条发送到deallocated实例的NSArray消息,意味着您使用的变量的保留计数为负数,则您以某种方式将其删除/释放


在头文件中,您使用
(非原子,retain)
声明了数组,这意味着它们的retain计数为1。在m文件中,您应该在
-(void)dealloc{}中取消分配数组
方法。您使用arrayWithObjects方法初始化了数组,根据描述,使用此方法您不拥有这些对象,因此无法释放/删除/删除它们。

如果您收到一条发送到解除分配实例的NSArray消息,意味着您使用的变量保留计数为负数,则删除/释放不知怎的,我把它弄坏了


在头文件中,您使用
(非原子,retain)
声明了数组,这意味着它们的retain计数为1。在m文件中,您应该在
-(void)dealloc{}中取消分配数组
method。您使用arrayWithObjects方法初始化了数组,根据描述,使用此方法您不拥有这些对象,因此无法释放/删除/删除它们。

是否将NSZombieEnabled环境设置为YES?是的,我一直得到[21673:fb03]***-[\uu NSArrayI release]:消息发送到解除分配的实例blahblah或[u NSArrayI retain],具体取决于我是否删除了上面指定的未使用的变量ynquants。请给我们执行错误访问错误消息。消息RetainCount没有用。不要调用它。您是否将NSZombieEnabled环境设置为YES?是的,我一直得到[21673:fb03]***-[u NSArrayI release]:消息发送到解除分配的实例blahblah或[\uu NSArrayI retain],这取决于我是否删除了上面指定的未使用的变量ynquants。请给我们EXEC BAD ACCESS错误消息RetainCount是无用的。不要调用它。第一部分是正确的-他必须释放它们。第二部分是错误的,因为他使用的是属性的setter方法,数组被保留-因此必须释放。尽管它应该最好是“复制”。那么,我是否应该检查并查看我提前释放了哪些对象?我如何知道要查找哪个对象?:|尝试在代码中添加一个NSLog(@“%d”,[object retaincount]);看看问题到底出在哪里?将属性更改为(非原子,复制)有什么好处?这对我来说没什么作用-我在完全不同的时间制作了它们:一个在啤酒之前,另一个在之后。第一部分是对的-他必须释放它们。第二部分是错的,因为他是usi