2011-03-16 69 views
0

我有太多的代码知道我需要在这里引用,但在我的应用程序委托我有一个NSMutableArray。然后在另一个类中,它创建一个NSMutableArray的新条目,但是在返回到另一个应该使用它显示屏幕上的类时,它不显示任何内容。将NSMutableArray计数放在类的末尾,创建它将显示数字1,然后将相同的NSLog代码放在要使用的类的起始处,返回0.NSMutableArray计数不断变化

任何想法为什么会这样是什么?

编辑:好吧,我会尽力的,包括所有相关的代码..

应用delegate.h:

@interface palettesAppDelegate : NSObject <UIApplicationDelegate> { 
NSMutableArray *colourPalettesContainer; 

} 
@property (assign, readwrite) NSMutableArray *colourPalettesContainer; 
@end 

应用delegate.m:

#import "palettesAppDelegate.h" 

@implementation palettesAppDelegate 

@synthesize colourPalettesContainer; 

- (void)dealloc { 
    [colourPalettesContainer release]; 
    [super dealloc]; 
} 


@end 

Homeview.h :

#import <UIKit/UIKit.h> 
#import "HandlingPalettes.h" 

@interface HomeView : UIViewController { 

    HandlingPalettes *handlingPalettes; 

} 


@end 

Homeview.m:

#import "HomeView.h" 
#import <QuartzCore/QuartzCore.h> 


@implementation HomeView 


- (void)viewDidLoad { 
    [super viewDidLoad]; 
handlingPalettes = [[HandlingPalettes alloc] init]; 

    [handlingPalettes newPalette]; 

} 

-(void)viewWillAppear:(BOOL)animated { 


    NSLog(@"view will appear: %i", [dataCenter.colourPalettesContainer count]); 
    int numberOfExisting = [dataCenter.colourPalettesContainer count]; 

} 

- (void)dealloc { 
    [handlingPalettes release]; 
    [super dealloc]; 
} 


@end 

HandlingPalettes.h:

#import <UIKit/UIKit.h> 

@interface HandlingPalettes : UIViewController { 

} 


-(void)newPalette; 



@end 

HandlingPalettes.m:

#import "HandlingPalettes.h" 
#import "HomeView.h" 
#import "palettesAppDelegate.h" 



@implementation HandlingPalettes 


-(void)newPalette { 

    palettesAppDelegate *dataCenter = (palettesAppDelegate *)[[UIApplication sharedApplication] delegate]; 

    //If this is the first palette 
    if (dataCenter.colourPalettesContainer == nil) { 
    dataCenter.colourPalettesContainer = [[NSMutableArray alloc] init]; 
    } 
    //Add a new palette 

     [dataCenter.colourPalettesContainer addObject:@"Test1", @"Test2", nil]; 


    NSLog(@"Handling: %i", [dataCenter.colourPalettesContainer count]); 


}- (void)dealloc { 
    [super dealloc]; 
} 


@end 
+0

没有看到你的代码,我不知道。 – 2011-03-16 23:37:34

+0

没有看到代码......有两件事要检查(a)它确实是* same *'NSMutableArray',并且不太可能(b)你没有删除你添加的内容。 – CRD 2011-03-16 23:44:30

+0

[dataCenter.colourPalettesContainer addObject:@“Test”,nil]; 为什么你有多个参数呢?你不需要零... – 2011-03-16 23:58:20

回答

1

你的主要mutablearray是在你的应用程序代理。所以,看是否在每一个方法,你要访问你的行中设置应用程序的委托关系

palettesAppDelegate *dataCenter = (palettesAppDelegate *)[[UIApplication sharedApplication] delegate]; 

现在阵列会发生什么,当你调用数据中心对象,你会引用应用代表和你的程序会找到这个数组。

您可能还会发现,您需要在要引用App Delegate的每个对象中都有#import "palettesAppDelegate.h"

请注意,只是添加应用程序委托代码不一定是从架构角度处理此问题的正确方法。但是,如果它起作用,你至少知道你原来问题的答案。

+0

那么我需要做些什么来解决这个问题呢? – Andrew 2011-03-17 01:03:12

1

我倾向于摆脱newPalette方法,而是在您的应用程序委托中为colourPalettesContainer创建一个getter方法。 即:

appdelegate.h

@interface PalettesAppDelegate : NSObject <UIApplicationDelegate> { 
    NSMutableArray *colourPalettesContainer; 

} 
@property (non-atomic, retain) NSMutableArray *colourPalettesContainer; 
@end 

@implementation palettesAppDelegate 

appdelegate.m

#import "appdelegate.h" 
@synthesize colourPalettesContainer; 
- (NSMutableArray *) colourPalettesContainer{ 
    if(colourPalettesContainer==nil){ 
     colourPalettesContainer=[[NSMutableArray alloc] init]; 
    } 
    return colourPalettesContainer; 
} 
- (void)dealloc { 
    [colourPalettesContainer release]; 
    [super dealloc]; 
} 
@end 

,那么你应该能够通过调用

[appDelegate.colourPalettesContainer addObject:object]; 
1

我怀疑问题最终是要添加项目涉及colourPalettesContainer成员的混淆内存管理。你在应用程序代理的dealloc方法中释放它,但该类永远不会保留它!如果你关注苹果公司的memory management guidelines,你的类应该只能释放他们拥有的对象(比如他们自己保留的)。例如,您可以通过声明数组的属性retain做到这一点:

@property (retain) NSMutableArray *colourPalettesContainer; 

(为了防止泄漏的数组,你还需要释放或newPalette方法自动释放它保留和释放应始终进来)

但更好的是,为什么不简单地在应用程序委托的init方法或其访问器中创建数组(如果由于某种原因,只想在第一次使用时继续创建它)?除非您想要一次替换所有调色板,否则没有理由让该阵列从应用程序委托之外分配。

@interface PalettesAppDelegate : NSObject <UIApplicationDelegate> { 
@private 
    NSMutableArray *colourPalettesContainer; 
} 
@property (readonly) NSMutableArray *colourPalettesContainer; 
@end 

@implementation PalettesAppDelegate 

- (NSMutableArray *)colourPalettesContainer { 
    if (colourPalettesContainer == nil) { 
     colourPalettesContainer = [[NSMutableArray alloc] init]; 
    return colourPalettesContainer; 
} 

- (void)dealloc { 
    [colourPalettesContainer release]; 
    [super dealloc]; 
} 
@end 

,使设计更清洁,在colourPalettesContainer属性的类型更改为NSArray *,并添加一个-addPalette:方法应用程序的委托。 (在一个类中公开暴露一个可变数组几乎不是一个好主意。)然后你可以简单地在HandlingPalettes中删除-newPalette。 (如果您想要在HandlingPalettes中使用所有调色板处理方法,那么只需将该阵列移动到那里即可。如果您需要从应用程序中的随机位置访问调色板,那么您可以简单地将保留引用放置在您的HandlingPalettes对象中应用程序代理)。

一旦清理了对象所有权混乱,计数不匹配将自行解决“魔术”,或者原因可能会变得更加明显。在后一种情况下,请检查HomeViewdataCenter实际上与HandlingPalettes中的对象相同。 (你怎么省略得到HomeView它的参考 - 你确定你是不是偶然创建应用程序委托的另一个实例?)

(顺便说一句,你可能想用的-addObjects:,不-addObject:newPalette还要注意。如果由于某种原因,Xcode的项目模板就是这样创建的,只需重命名类即可,小写的类名太容易混淆变量名。另外,试图找到更好的名字:例如,而不是HandlingPalettes,我会使用PalettesViewController(以反映它是UIViewController的子类的事实);而不是dataCenter,我宁愿选择appDelegate。)