代码之家  ›  专栏  ›  技术社区  ›  aahrens

iPhone:使用AppDelegate中的NSMutableArry作为全局变量

  •  0
  • aahrens  · 技术社区  · 14 年前

    下面是我如何做到这一点

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

    我的另一个观点

    在viewDidload中,我将视图中的数组设置为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个。所以它似乎没有得到适当的更新。有什么建议吗?

    2 回复  |  直到 14 年前
        1
  •  2
  •   TechZen    14 年前

    有几件事:

    首先,在应用程序委托中,您需要确保在任何对象尝试访问数组之前初始化数组。吸引顾客就是好办法。

    -(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;
    }
    

    现在,对属性的任何调用都保证返回一个数组。

    在视图控制器中:

    @property(nonatomic,assign) NSMutableArray *globalClasses;
    

    然后每次引用它时,请确保使用self表示法:

    self.globalClasses=//...whatever
    

    说了这么多,是的 在应用程序中赤裸裸地粘贴数组或任何其他哑数据对象。您无法控制每段代码将对数组执行什么操作。在向数组中添加或删除数据的每个位置都必须复制所有验证代码。

    最好将数组包装在一个自定义类中并对其进行保护,这样它就只能由classes方法更改。

    像这样:

    @interface MyData : NSObject {
    @protected
        NSMutableArray *myDataArray;
    }
    
    -(void) addObject:(id) anObject;
    -(void) removeObjectAtIndex;(NSInteger) anIndex;
    
    @end
    

    @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委托的属性中,如上所示。这将使您的数据保持干净和模块化,因此您可以在各种应用程序对象中安全地使用它,而无需对每个对象中的阵列进行微观管理。

        2
  •  0
  •   Alex Reynolds    14 年前

    allCourses = [[NSMutableArray alloc] init];
    CalcAppDelegate *appDelegate = (CalcAppDelegate *)[[UIApplication sharedApplication] delegate];
    allCourses = appDelegate.globalClasses;
    
    1. 您不需要分配新数组,因为您希望保留现有数组(应用程序委托中的数组)
    2. 如果要使用属性,则需要使用 self

    相反,请尝试:

    CalcAppDelegate *appDelegate = (CalcAppDelegate *)[[UIApplication sharedApplication] delegate];
    self.allCourses = appDelegate.globalClasses;