一千萬個為什麽

搜索

iPhone:在AppDelegate中使用NSMutableArry作為全局變量


我想要完成的是在AppDelegate中定義一個NSMutableArray。然後我有兩個UIViewControllers。一個視圖負責從AppDelegate顯示數組。另一個視圖用於向數組添加項目。所以數組開始是空的。 View1不顯示任何內容,因為數組為空。用戶轉到View2並在AppDelegate中向項目添加項目。然後,當用戶返回View1時,它現在顯示一個項目。

以下是我試圖實現這一目標的方法

@interface CalcAppDelegate : NSObject  {
 UIWindow *window;
 UITabBarController *tabBarController;
 NSMutableArray *globalClasses;
}
@property (nonatomic,retain) NSMutableArray *globalClasses;

我的另一種觀點

在viewDidload中,我將View中的數組設置為AppDelegate中的數組。努力保留價值觀。

allCourses = [[NSMutableArray alloc]init];
CalcAppDelegate *appDelegate = (CalcAppDelegate *)[[UIApplication sharedApplication] delegate];
allCourses = appDelegate.globalClasses;

然後我會通過添加一個新項來更新我的allCourses數組。然後嘗試將AppDelegate中的數組設置為等於修改後的數組。

CalcAppDelegate *appDel = (CalcAppDelegate *)[[UIApplication sharedApplication] delegate];
    NSLog(@"Size before reset %d",[appDel.globalClasses count]);
    appDel.globalClasses = allCourses;
    NSLog(@"Size after reset %d",[appDel.globalClasses count]);

我所看到的返回的是之前的2和之後的2。因此它似乎沒有得到正確的更新。有什麽建議麽?

最佳答案

一些東西:

首先,在您的app委托中,您需要確保在任何對象嘗試訪問它之前初始化該數組。客戶吸氣劑對此有好處。

-(void) getGlobalClasses{
    if (globalClasses!=nil) {
        return globalClasses;
    }
    NSMutableArray *newArray=[[NSMutableArray alloc] initWithCapacity:1]; //yes, I'm old school
    self.globalClasses=newArray;
    [newArray release];
    return globalClasses;
}

現在對該屬性的任何調用都保證返回一個數組。

在視圖控制器中,您需要定義用於保存數組的屬性。由於數組由app delegate持有並且將始終存在,因此最好分配數組而不是保留它。這樣,您始終知道您正在寫入完全相同的數組,並且應用程序委托可以完全控制其生命周期。

在視圖控制器中:

@property(nonatomic,assign) NSMutableArray *globalClasses;

然後每次你引用它時一定要使用自我符號:

self.globalClasses=//...whatever

說完這一切之後,在你的應用程序中裸露數組或任何其他啞數據對象是 非常糟糕的做法 。您無法控制每段代碼對數組的作用。您必須在每個添加或刪除數據的位置復制所有驗證代碼。

最好將數組包裝在自定義類中並使其受到保護,以便只能通過類方法進行更改。

像這樣:

@interface MyData : NSObject {
@protected
    NSMutableArray *myDataArray;
}

-(void) addObject:(id) anObject;
-(void) removeObjectAtIndex;(NSInteger) anIndex;

@end

scratch.m

@interface scratch ()
@property(nonatomic, retain)  NSMutableArray *myDataArray;

@end

@implementation scratch
@synthesize myDataArray;

-(void) addObject:(id) anObject{
    //...code to check if anObject is a valid one to add to the array
    [self.myDataArray addObject:anObject];
}//------------------------------------addObject:------------------------------------

-(void) removeObjectAtIndex;(NSInteger) anIndex{
    //... do bounds checking and other testing to ensure no problems
   //will result from removing the object at the given idex
    [self.myDataArray removeObjectAtIndex:anIndex];
}//-------------------------------------(void) removeObjectAtIndex;(NSInteger) anIndex------------------------------------

然後將自定義類添加為app delegate的屬性,如上所示。這將使您的數據保持清潔和模塊化,因此您可以安全地在各種應用程序重新對象中使用它,而無需對每個對象中的數組進行微觀管理。

轉載註明原文: iPhone:在AppDelegate中使用NSMutableArry作為全局變量

猜你喜歡