2011-07-28 111 views
3

我怎樣才能懶惰地初始化一個NSMutableArray的按鈕?我做這樣的事情:我該如何懶惰初始化一個NSMutableArray?

-(NSMutableArray *)roasteryButtons 
{ 
    if(!roasteryButtons) 
    { 
    roasteryButtons = [ NSMutableArray new]; 
    //other code 
    } 
return roasteryButtons; 
} 

而不知道該怎麼做才能調用這個懶惰初始化?即我需要初始化數組,這樣我可以設置每個按鈕框架陣列中

回答

2

你做了什麼是正確的。不是在類的init方法中分配數組,而是僅在需要時才分配數組。因此它起到了懶惰分配的作用。

在課堂上,不管你想要的數組,你只需要調用,

NSMutableArray *arr = [self roasteryButtons]; 

也宣佈在頭文件,-(NSMutableArray*)roasteryButtons;方法。

如果要在陣列中其他類的引用,調用,比如,

[classObj roasteryButtons]; 

我已經展示了它作爲實例方法。你也可以將它聲明爲類方法,如果你想這樣做的話。

並釋放在-(void)dealloc方法。

0

你可以讓你的方法一類方法:

+(NSMutableArray *)roasteryButtons { 

這樣你就可以把它像這樣:

[MyRoasteryButtonClass roasteryButtons]; 

這將返回你的對象。

希望這會有所幫助。

2

我想你知道什麼時候調用這個方法吧?

首先,你不應該使用「new」方法,而應該使用[[NSMutableArray alloc] init]:你應該看看NSArray的所有現有[Init]方法:有一堆他們(與容量,與對象等...)

無論如何,你應該添加一些參數到你的方法[roasteryButtons]:參數,這將有助於方法知道,例如有多少個按鈕來創建,什麼是他們必須拿出框架等,所以這看起來有點像

-(NSMutableArray *)roasteryButtonsWithFrame:(*Frame) andNumbersOfButtons:(int) 

例如...

或者不是參數,你可以傳遞一個引用給一個委託,這個委託將能夠給出這些問題的答案(有多少個按鈕,我的框架和邊界是什麼等等)。所以在這種情況下,方法看起來像:

-(NSMutableArray *)roasteryButtonsWithDelegate:(id) 

(此委託應該實現,你將創建一個協議,包含該委託將要應對不同的方法。即[howManyButtons]等方法...)

+0

沒有什麼錯用'new',看到http://stackoverflow.com/questions/719877/use-of-alloc-init-instead-of-new-objective-c – mvds

+1

不,我知道,我我剛剛提到過,因爲這可能不是他所做的決定,而是另一種面嚮對象語言的習慣。簡單Init的變體通常非常有用。 –

+0

好的。但爲什麼numberofbuttons不僅僅是一個'int',或者更好,'NSInteger',甚至更好,'NSUInteger'? 'int'是一種古老的語言的習慣;-) – mvds

1

最完美的方式,以懶惰初始化是遵循

在.h文件中聲明你的NSMutableArray作爲財產遵循

@屬性(非原子,強)的NSMutableArray *陣列;

現在.m文件合成它和做在懶吸氣初始化像如下:

@synthesize陣列= _array; (NS_MarrayArray *)數組 {!__array} _array = [[NSMutableArray alloc] init]; //此行稱爲惰性初始化..此行將在程序//運行時創建MutableArray。

回報_array }

現在回答爲什麼我們需要的是,它需要關心的是,如果沒有創建的NSMutableArray然後在程序運行時創建它,這樣你的應用程序不會崩潰。

相關問題