我在App Appate中有一个NSArray,它包含一系列LPProduct对象,每个对象都有一个LPColor对象数组,我们有一个名为 price 的CGFloat属性。
为了获得包含所有可自定义的LPProduct的数组,我在App Delegate中创建了一个名为 getCustomizableProducts 的方法。代码在这里:
- (NSArray *)getCustomizableProducts
{
NSMutableArray *customizables = [[NSMutableArray alloc] initWithArray:[self products]];
for (LPProduct *product in [self products])
{
if (![product isCustomizable])
{
[customizables removeObject:product];
}
}
for (NSInteger i = 0; i < [customizables count]; i++)
{
for (NSInteger j = 0; j < [[[customizables objectAtIndex:i] colors] count]; j++)
{
NSLog(@"prices 1: %f", [[[[customizables objectAtIndex:i] colors] objectAtIndex:j] price]);
}
}
return (NSArray *) customizables;
}
NSLog的结果如下:
2011-07-22 14:06:44.463 La Portegna[2937:707] prices 1: 315.000000
2011-07-22 14:06:44.470 La Portegna[2937:707] prices 1: 315.000000
2011-07-22 14:06:44.472 La Portegna[2937:707] prices 1: 315.000000
2011-07-22 14:06:44.473 La Portegna[2937:707] prices 1: 195.000000
2011-07-22 14:06:44.475 La Portegna[2937:707] prices 1: 195.000000
2011-07-22 14:06:44.477 La Portegna[2937:707] prices 1: 195.000000
2011-07-22 14:06:44.478 La Portegna[2937:707] prices 1: 145.000000
2011-07-22 14:06:44.482 La Portegna[2937:707] prices 1: 145.000000
2011-07-22 14:06:44.484 La Portegna[2937:707] prices 1: 145.000000
2011-07-22 14:06:44.489 La Portegna[2937:707] prices 1: 145.000000
2011-07-22 14:06:44.492 La Portegna[2937:707] prices 1: 55.000000
2011-07-22 14:06:44.495 La Portegna[2937:707] prices 1: 55.000000
2011-07-22 14:06:44.498 La Portegna[2937:707] prices 1: 55.000000
2011-07-22 14:06:44.501 La Portegna[2937:707] prices 1: 55.000000
2011-07-22 14:06:44.504 La Portegna[2937:707] prices 1: 120.000000
2011-07-22 14:06:44.507 La Portegna[2937:707] prices 1: 120.000000
2011-07-22 14:06:44.510 La Portegna[2937:707] prices 1: 120.000000
2011-07-22 14:06:44.513 La Portegna[2937:707] prices 1: 120.000000
2011-07-22 14:06:44.516 La Portegna[2937:707] prices 1: 215.000000
2011-07-22 14:06:44.519 La Portegna[2937:707] prices 1: 215.000000
2011-07-22 14:06:44.521 La Portegna[2937:707] prices 1: 215.000000
2011-07-22 14:06:44.524 La Portegna[2937:707] prices 1: 110.000000
2011-07-22 14:06:44.527 La Portegna[2937:707] prices 1: 110.000000
2011-07-22 14:06:44.530 La Portegna[2937:707] prices 1: 110.000000
2011-07-22 14:06:44.533 La Portegna[2937:707] prices 1: 110.000000
2011-07-22 14:06:44.536 La Portegna[2937:707] prices 1: 110.000000
2011-07-22 14:06:44.539 La Portegna[2937:707] prices 1: 95.000000
2011-07-22 14:06:44.542 La Portegna[2937:707] prices 1: 95.000000
2011-07-22 14:06:44.545 La Portegna[2937:707] prices 1: 95.000000
2011-07-22 14:06:44.548 La Portegna[2937:707] prices 1: 95.000000
2011-07-22 14:06:44.550 La Portegna[2937:707] prices 1: 95.000000
2011-07-22 14:06:44.553 La Portegna[2937:707] prices 1: 180.000000
2011-07-22 14:06:44.556 La Portegna[2937:707] prices 1: 180.000000
2011-07-22 14:06:44.559 La Portegna[2937:707] prices 1: 180.000000
2011-07-22 14:06:44.561 La Portegna[2937:707] prices 1: 65.000000
2011-07-22 14:06:44.564 La Portegna[2937:707] prices 1: 65.000000
2011-07-22 14:06:44.568 La Portegna[2937:707] prices 1: 65.000000
2011-07-22 14:06:44.571 La Portegna[2937:707] prices 1: 35.000000
2011-07-22 14:06:44.573 La Portegna[2937:707] prices 1: 35.000000
2011-07-22 14:06:44.576 La Portegna[2937:707] prices 1: 35.000000
2011-07-22 14:06:44.579 La Portegna[2937:707] prices 1: 35.000000
2011-07-22 14:06:44.582 La Portegna[2937:707] prices 1: 35.000000
2011-07-22 14:06:44.585 La Portegna[2937:707] prices 1: 35.000000
2011-07-22 14:06:44.588 La Portegna[2937:707] prices 1: 35.000000
然后,在其他UIViewController中,在 viewDidLoad ,我会像这样调用 getCustomizableProducts :
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
[[self navigationController] setNavigationBarHidden:YES];
La_PortegnaAppDelegate *appDelegate = (La_PortegnaAppDelegate *) [[UIApplication sharedApplication] delegate];
[self setAll:[appDelegate getCustomizableProducts]];
for (NSInteger i = 0; i < [[self all] count]; i++)
{
for (NSInteger j = 0; j < [[[[self all] objectAtIndex:i] colors] count]; j++)
{
NSLog(@"prices 2: %f", [[[[[self all] objectAtIndex:i] colors] objectAtIndex:j] price]);
}
}
[self setProducts:[[NSMutableArray alloc] init]];
[self getCollection:0];
[self printCollection];
}
但NSLog的结果并不是我们所期望的:
2011-07-22 14:06:44.590 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.593 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.596 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.600 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.602 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.605 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.608 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.611 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.614 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.617 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.620 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.622 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.625 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.628 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.631 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.634 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.637 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.640 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.643 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.646 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.649 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.652 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.654 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.657 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.660 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.663 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.666 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.669 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.672 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.675 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.678 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.681 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.683 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.686 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.689 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.692 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.695 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.697 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.701 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.704 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.707 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.709 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.712 La Portegna[2937:707] prices 2: 0.000000
2011-07-22 14:06:44.715 La Portegna[2937:707] prices 2: 0.000000
所有都被声明为NSArray。
任何人都可以说我做错了什么?为什么价格会突然消失?
非常感谢您,最好的问候!
答案 0 :(得分:0)
看起来all
设置不正确。检查代理返回的内容以及all
中存储的内容,以查明问题。
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
[[self navigationController] setNavigationBarHidden:YES];
La_PortegnaAppDelegate *appDelegate = (La_PortegnaAppDelegate *) [[UIApplication sharedApplication] delegate];
NSLog(@"customizables: %@",[appDelegate getCustomizableProducts]); // <-- add this
[self setAll:[appDelegate getCustomizableProducts]];
NSLog(@"all: %@", [self all]); // <-- and this
for (NSInteger i = 0; i < [[self all] count]; i++)
{
for (NSInteger j = 0; j < [[[[self all] objectAtIndex:i] colors] count]; j++)
{
NSLog(@"prices 2: %f", [[[[[self all] objectAtIndex:i] colors] objectAtIndex:j] price]);
}
}
[self setProducts:[[NSMutableArray alloc] init]];
[self getCollection:0];
[self printCollection];
}
您的getCustomizableProducts
方法中也存在内存泄漏。考虑将其最后一行更改为
return (NSArray *)[customizables autorelease];