2011-03-16 94 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。)