2013-05-02 85 views
0

我創建了一個phonegap插件來爲本機代碼提供一個變量。這工作正常。現在我需要從其他類訪問這個值,所以我決定創建一個extern NSString。無法從另一個類訪問extern變量

.H

extern NSString *lkwid; 

@interface MyPlugin : CDVPlugin { 

} 

@property (retain, nonatomic) NSString *lkwid;  
-(void) setMyValue:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; 

.M

#import "MyPlugin.h" 

@implementation MyPlugin 

@synthesize lkwid; 

NSString *lkwid = @""; 


-(void) setMyValue:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options { 
    NSString* callbackId = [arguments objectAtIndex:1]; 
    lkwid = callbackId; 
    NSLog(@"set value %@ ",lkwid); 
    //NSLog shows the correct value from Javascript 
} 

現在我想從MainViewController.m訪問lkwid(MyPlugin.h是進口的),但lkwid是空的。爲什麼?

+0

您確定在調用MyPlugin setMyValue:withDict之後,在您的MainViewController中使用'lkwid'嗎? – rmaddy 2013-05-02 16:58:51

+0

注意事項 - 如果您將'NSString * lkwid = @「」;'移到'@ implementation'之外,它會更清晰。這是一個全球性的變量,與班級沒有任何關係。 – rmaddy 2013-05-02 16:59:48

回答

1

我認爲你是混淆實例變量和靜態(類)變量。 extern NSString *lkwid聲明一個全局可訪問的變量。 @property (retain,nonatomic) NSString *lkwid爲你的對象聲明一個實例變量。如果你想讓它設置全局變量,然後由ALL的實例共享,那麼你不應該綜合物業andimplement getter和setter自己的方式如下:

- (NSString*) lkwid 
{ 
    return lkwid; 
} 

- (void) setLkwid:(NSString*)value 
{ 
    lkwid = value; 
} 

確保您也不要聲明名稱爲lkwid的實例變量。

+0

所以你的意思是刪除@綜合lkwid和@ proberty ...將工作?我會嘗試... – Thomas1703 2013-05-02 18:16:43

+0

我認爲它應該,但你仍然必須手動實現getter和setter。 – aLevelOfIndirection 2013-05-02 18:27:49

+0

好的,我沒有刪除這兩點,並創建了getter和setter。但是,我如何在MainViewController中初始化類,以便該類是MainViewCOntroller類中所有方法的實例? – Thomas1703 2013-05-02 18:33:23