2014-05-21 19 views
1

我是iOS開發新手,這裏是我的第一個應用程序計算器, 但NSMuteableArray「_numberArrayWaitingForCalculate」總是「無」,我不知道該怎麼辦?NSMutableArray addObject是否爲零?

這裏是接口

@interface demoViewController() 
@property (strong,nonatomic)NSString *valueString; 
@property (strong,nonatomic)NSMutableArray *numberArrayWaitingForCalculate; 
@end 

這裏器具1

@implementation demoViewController 
@synthesize numberArrayWaitingForCalculate=_numberArrayWaitingForCalculate; 

- (NSMutableArray *)numberWaitingForCalculate 
{ 
    if(!_numberArrayWaitingForCalculate) 
     _numberArrayWaitingForCalculate=[[NSMutableArray alloc]init]; 

    return _numberArrayWaitingForCalculate; 
} 

這裏是tapNumber方法

- (IBAction)tapNumber:(UIButton *)numberButton { 
    if(LastButtonWasMode) 
    { 
     [email protected]""; 
     LastButtonWasMode=NO; 
    } 

    NSString *numberAsString = numberButton.currentTitle; 
    _valueString=[_valueString stringByAppendingString:numberAsString]; 
    result.text=[NSString stringWithFormat:@"%@",_valueString]; 
    } 

這裏是tapPlus方法

- (IBAction)tapPlus:(id)sender { 
    [_numberArrayWaitingForCalculate addObject:[NSNumber numberWithInt:[_valueString intValue]]]; 
    resultOfAllNumberInputBefore +=[_valueString intValue]; 
    [self setMode:1]; 

}

+4

對指向數組的實例變量使用延遲初始化毫無意義,正如您發現的那樣,它是脆弱的。只需在您指定的初始化程序中初始化數組並完成它。 – bbum

回答

3

以下行應該使用屬性而不是實例變量。即你實際上沒有調用分配數組的getter。

改變這一行:

[_numberArrayWaitingForCalculate addObject:[NSNumber numberWithInt:[_valueString intValue]]]; 

到:

[self.numberArrayWaitingForCalculate addObject:[NSNumber numberWithInt:[_valueString intValue]]]; 
+0

當我使用「self.numberArrayWaitingForCalculate」而不是「_numberArrayWatingForCalculate」之後,我調試時沒有「numberArrayWaitingForCalculate」對象,它是空的。 – alex

+0

當我使用「_numberArrayWatingForCalculate」,我可以得到「numberArrayWaitingForCalculate」對象時調試,通過它的「無」 – alex

+0

這是因爲當使用self.numberArrayWaitingForCalcuate,實例變量被稱爲_numberArrayWaitingForCalculate(除非你分配給別的東西)。長話短說,皮包是現貨。因爲您不執行任何自定義初始化,所以覆蓋該數組上的getter沒有任何好處。只需使用標準的getter即可。然後,巴姆,完成。 –

3

您創建了一個getter說,「懶加載」的可變數組(這意味着你創建它,如果它不存在的話。這是一個有效的方法

但是,如果你這樣做,你需要總是使用getter,你直接使用iVar(_numberArrayWaitingForCalculate),不要這樣做,將所有「_number ArrayWaitingForCalculate「與[self numberArrayWaitingForCalculate]除了在你的getters/setter的實現,可能是你的dealloc方法。

所以你tapPlus方法應爲:

- (IBAction)tapPlus:(id)sender 
{ 
    [[self numberArrayWaitingForCalculate] addObject:[NSNumber numberWithInt:[_valueString intValue]]]; 
    resultOfAllNumberInputBefore +=[_valueString intValue]; 
    [self setMode:1]; 
} 

編輯:

順便說一句,對於輕量級的空可變數組的東西,我想我會採取不同的方法。我不是在getter中延遲加載數組,而是爲我的類創建一個init方法,該方法創建一個空的可變數組並將其安裝在iVar中。

像視圖控制器這樣的對象可以被多種方式初始化。它可能會被初始化爲initWithNibName:bundle:initWithCoder:

我在這種情況下做的是創建一個方法doInitSetup,並從兩個地方調用它。

+0

當我使用「self.numberArrayWaitingForCalculate」而不是「_numberArrayWatingForCalculate」之後,當我調試時沒有「numberArrayWaitingForCalculate」對象,它是空的。當我使用「_numberArrayWatingForCalculate」時,調試時可以得到「numberArrayWaitingForCalculate」對象,通過它的「nil」 – alex

相關問題