Несколько вещей:
Во-первых, в вашем делегате приложения вы должны убедиться, что вы инициализируете массив, прежде чем какой-либо объект попытается получить к нему доступ. Получатель клиента хорош для этого.
-(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.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------------------------------------
Затем добавьте пользовательский класс a свойство делегата приложения, как показано выше. Это обеспечит чистоту и модульность ваших данных, чтобы вы могли безопасно использовать их в широком спектре объектов, не требующих микроуправления массивом в каждом объекте.