2017-06-26 48 views
2

在此演示代碼下面,過程的邏輯並不重要。訪問器方式與靜態int和靜態NSArray不同

@interface ViewController()<UITableViewDataSource, UITableViewDelegate> 

@end 

static int channelIndex = 0; 
static NSMutableArray *channelsDataArray = nil; 

@implementation ViewController 
    - (void)getSomething { 
      // Append the desiredValuesDict dictionary to the following array. 
      if (!self.channelsDataArray) { 
       self.channelsDataArray = [[NSMutableArray alloc] initWithObjects: desiredValuesDict, nil]; 
      } else { 
       [self.channelsDataArray addObject:desiredValuesDict]; 
       NSLog(@"channelsDataArray : %@", self.channelsDataArray); 
      } 

      // This will print the result I expected. 
      NSLog(@"channelIndxBefore: %i", channelIndex); 
      ++channelIndex; 
      NSLog(@"channelIndxAfter: %i", channelIndex); 
    } 


@end 

我的問題是,如果我叫channelIndex以這種方式「self.channeIndex ++」就會出來一個警告:

格式指定類型「詮釋」,但參數的類型爲'NSInteger *' (aka'long *')

如果我以這種方式調用「channelIndex ++」,它將正常工作。

奇怪的是,我還有一個靜態的NSMutableArray channelsDataArray,如果我只是叫

[self.channelsDataArray addObject:desiredValuesDict]; 

它將正常工作對象添加到變種。但是,如果我只是用

[channelsDataArray addObject:desiredValuesDict]; 

它不會顯示任何警告,但channelsDataArray將是零,而不能desiredValuesDict分配到它。

問題:我應該何時添加自我前綴?爲什麼他們都是靜態變量,但一個人必須增加自我,另一個不?

+1

我猜你有另一個'@ interface'(在'.h'文件)。閱讀,所有應該變得明顯。如果不查找實例和全局變量之間的差異。如果在編輯問題後仍然卡住其他界面,並且有人會毫無疑問地幫助你。當然,如果沒有另一個界面,我的猜測是錯誤的... – CRD

+0

@CRD你是完全正確的!我確實在.h文件中聲明瞭channelDataArray聲明,並在interface()和implementation之間聲明瞭channelDataArray。這是c類型的全局變量。非常感謝你,你可以在我的問題下面發表你的答案,我會讓你高興! –

回答

2

[原文評論:]

的錯誤意味着你有另一個@interface(在.h文件),並且您已經聲明在該文件具有相同的名稱作爲全局變量的實例變量你已在引用文件中聲明。你需要刪除其中的一個,這取決於你需要什麼。

HTH