Я тащился через некоторый код в течение двух дней, пытаясь выяснить, почему я не мог выбрать глобальную переменную NSMutableArray, которую я объявил в.h и реализовал в.m и наборе функцию viewDidLoad.
Это наконец рассветало на мне: нет такой вещи как глобальная переменная в Objective C, по крайней мере, не в смысле PHP, который я узнал. Я действительно никогда не читал ошибочные предупреждения XCode, но там это было, даже если не совсем простой английский язык: "Переменная экземпляра 'вздор' получила доступ в методе класса".
Мой вопрос: Что я, как предполагается, делаю теперь? У меня есть два Контроллера Представления, которые должны получить доступ к центральному NSMutableDictionary, который я генерирую из файла JSON через URL. Это - в основном расширенное меню для всех моих холмов развертки Табличного представления, и я хотел бы иметь, связывают другие "глобальные" (нестатические) переменные.
Я должен захватить JSON каждый раз, когда я хочу генерировать этот NSMutableDictionary или есть ли некоторый способ установить его однажды и получить доступ к нему от различных классов через #import? Я должен записать данные в файл, или есть ли другой способ, которым люди обычно делают это?
Если у вас есть два контроллера представления, которые обращаются к общему NSMutableDictionary, можете ли вы передать указатель на общий словарь в их соответствующие сообщения init?
Итак, в вашем AppDelegate:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// the app delegate doesn't keep a reference this, it just passes it to the
// view controllers who retain the data (and it goes away when both have been released)
NSMutableDictionary * commonData = [[NSMutableDictionary new] autorelease];
// some method to parse the JSON and build the dictionary
[self populateDataFromJSON:commonData];
// each view controller retains the pointer to NSMutableDictionary (and releases it on dealloc)
self.m_viewControllerOne = [[[UIViewControllerOne alloc] initWithData:commonData] autorelease];
self.m_viewControllerTwo = [[[UIViewControllerTwo alloc] initWithData:commonData] autorelease];
}
И в ваших соответствующих реализациях UIViewControllerOne и UIViewControllerTwo
- (id)initWithData:(NSMutableDictionary*)data
{
// call the base class ini
if (!(self=[super init]))
return nil;
// set your retained property
self.sharedData = data;
}
// don't forget to release the property
- (void)dealloc {
[sharedData release];
[super dealloc];
}
В Obj-C есть глобальные переменные, вы инстанцируете их в App Delegate.
Но что касается вашей проблемы, вы, вероятно, хотите передать NSMutableDictonary при инстанцировании нового контроллера представления, как [UIView alloc] initWithDictionary:(NSMutableDictionary *)dict; если вы понимаете, о чем я.
В вашем примере один класс вызывает другой класс? Я бы подумал, что есть какой-то контроллер, который определяет, какой контроллер представления отображать, и это было бы местом для доступа и передачи словаря
.Просто создайте глобальную переменную. Глобальный означает вне всякой области.
NSMutableDictionary *gDictionary;
@implementation ...
@end
На самом деле существует множество способов сделать это (не прибегая к чему-то экстремальному, например, записи в файл). Вы можете создать «глобальный», используя:
Но все эти подходы делают ваш контроллер представления менее модульным (потому что они зависят от выхода "извне" для поиска глобальных данных), поэтому лучший подход, вероятно, состоит в том, чтобы сделать словарь свойством класса контроллера представления, которое должно быть явно установлено вызывающей стороной (либо внутри метода initWithDictionary: или с отдельным установщиком).