2010-02-17 8 views
1
// MyClass.h 
@interface MyClass : NSObject 
{ 
    NSDictionary *dictobj; 
} 
@end 

//MyClass.m 
@implementation MyClass 

-(void)applicationDiDFinishlaunching:(UIApplication *)application 
{ 

} 
-(void)methodA 
{ 
// Here i need to add objects into the dictionary 
} 

-(void)methodB 
{ 
//here i need to retrive the key and objects of Dictionary into array 
} 

Мой вопрос, так как Methoda и methodB используют объект NSDictionary [т.е. dictobj] В какой метод я должен написать этот код:Как объявить глобальную переменную в Objective-C?

dictobj = [[NSDictionary alloc]init]; 

Я не могу сделать это дважды в обоих методах, следовательно, как сделать это гольбиально?

+1

Это не глобальная переменная. Это переменная экземпляра. Глобальная переменная существует только в одном месте по всему вашему приложению. Переменная экземпляра существует внутри каждого экземпляра его содержащего класса. –

+0

Ya вы правы .... – suse

ответ

2

Прежде всего, если вам нужно изменить содержимое словаря, он должен быть изменяемым:

@interface MyClass : NSObject 
{ 
    NSMutableDictionary *dictobj; 
} 
@end 

Вы обычно создают переменные экземпляра, как dictobj в назначенном инициализаторе, как это:

- (id) init 
{ 
    [super init]; 
    dictobj = [[NSMutableDictionary alloc] init]; 
    return self; 
} 

и освободить память в -dealloc:

- (void) dealloc 
{ 
    [dictobj release]; 
    [super dealloc]; 
} 

Вы можете получить доступ лет ур переменные экземпляра где-нибудь в вашей реализации экземпляра (в отличие от методов класса):

-(void) methodA 
{ 
    // don't declare dictobj here, otherwise it will shadow your ivar 
    [dictobj setObject: @"Some value" forKey: @"Some key"]; 
} 

-(void) methodB 
{ 
    // this will print "Some value" to the console if methodA has been performed 
    NSLog(@"%@", [dictobj objectForKey: @"Some key"]); 
} 
+0

Я пробовал использовать метод init, гайка его напрасно :(... я не могу получить доступ к содержимому словаря в методе B, но в методе. Я могу получить к нему доступ Когда я пытаюсь напечатать objectForKey в методе B, его возвращает мне null. – suse

+1

Что вы делаете в этих методах точно? Похоже, вы либо объявляете локальную переменную метода, которая затеняет ваш ivar, либо просто перезагружает ivar. я обновил образец выше, чтобы лучше проиллюстрировать то, о чем я говорю. – Costique

0
-----AClass.h----- 
extern int myInt; // Anybody who imports AClass.h can access myInt. 

@interface AClass.h : SomeSuperClass 
{ 
    // ... 
} 

// ... 
@end 
-----end AClass.h----- 


-----AClass.h----- 
int myInt; 

@implementation AClass.h 
//... 
@end 
-----end AClass.h----- 
+0

Я сделал это .. но его локальный снова ... когда я пытаюсь получить доступ к методам, он дает ошибку, говоря, что dictobj undeclared – suse

+1

Как сказал Дейв ДеЛонг, attemp you делают, отличается от переменных glbal, но переменных экземпляра.Я обновляю свой ответ на глобальную переменную. – EEE

+0

Я думаю, что EEE предназначался для записи, это 'AClass.m' в последней части, n о? И вам также понадобится «#import» AClass.h », чтобы затем иметь возможность доступа и изменения этого' int', no? –

Смежные вопросы