2011-03-10 70 views
2

我創建.h文件中一個NSArray對象:NSArray的生命週期

NSArray *tempArray; 

,比我的Alloc它在.m文件中viewDidLoad中()方法:

tempArray = [[NSArray alloc] init]; //initilaize 
tempArray = [connect connectSeriesJSonBack]; //fill it (I try it works) 

但我想用這個陣列中的另一個方法,如:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)_scrollView 

我怎麼能組織陣列的生命週期,因爲我用的頁頭,再次達陣數據保留等沒有辦法。

+0

在另一種方法同班... ? – 2011-03-10 09:55:02

+0

是mihir同一班,我不明白爲什麼我無法達到陣列的數據? – NevzatR 2011-03-10 09:57:37

+0

如果您在.h文件中創建了tempArray,那麼您應該直接訪問該類中的tempArray ...不需要執行任何操作....除非您在訪問它之前先釋放它 – 2011-03-10 10:03:19

回答

2

你的第二次轉讓將產生一個內存泄漏,因爲分配永遠無法再次訪問。 connectSeriesJSonBAck可能會返回自動發佈NSArray。如果你想保持引用它在當前範圍之外,那麼你應該保留它:而不是

tempArray = [[NSArray alloc] init]; //initilaize 
tempArray = [connect connectSeriesJSonBack]; //fill it (I try it works) 

tempArray = [connect connectSeriesJSonBack]; 
[tempArray retain]; 

,並在你的類dealloc方法添加[tempArray release]

+0

謝謝Diederik,它的作品我應該閱讀一個內存管理教程。但你可以很快說出來嗎?爲什麼我不能分配,初始化這個對象並保留它? – NevzatR 2011-03-10 10:10:55

+0

你問Diederik,但可能我可以給你答案,這是因爲你從[connect connectSeriesJSonBack]得到了什麼;是一個分離的nsarray,你只需要保留它。 – Csabi 2011-03-10 10:17:41

+0

[連接connectSeriesJSonBack]不知道你將它分配給 - 做[[NSArray alloc] init]創建一個全新的對象,然後[connect connectSeriesJSonBack]做同樣的事情 - 浪費一個對象。對於其他問題,請閱讀http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmObjectOwnership.html%23//apple_ref/doc/uid/20000043-BEHDEDDB – Dre 2011-03-10 10:46:40

0

如果你想訪問類中的同一個數組,那麼你可以嘗試使它成爲一個類變量,以便它的成員可以在整個類中訪問。

+1

術語是「instance變量「或」伊娃「 – dreamlax 2011-03-10 10:08:14

0

我建議declar它implemantation像

@implementation YourViewController 

NSMutableArray *mutableExample; 
// or 
NSArray *example; 

然後在-()viewdidload ALLOC它像mutableExample = [[[NSMutableArray alloc] init]retain]; 或只是example = [[NSArray alloc] init];

和您可以使用它的每where.do不會忘記釋放吧! !

希望它幫助,如果有任何不明白請在註釋

wblade

+1

謝謝Csabi爲你的答案和幫助.. – NevzatR 2011-03-10 10:26:21

3

勿放於法陣,而是在dealloc方法釋放它 - 這樣你可以使用它在其他地方。

否則這裏還有另一個問題。

在這裏,您創建一個保留的,空的,不變的NSArray

tempArray = [[NSArray alloc] init]; 

現在你覆蓋指針指向留存情況下,耶,你剛剛泄露一個NSArray

tempArray = [connect connectSeriesJSonBack]; 

這方法應該返回一個自動釋放的NSArray。當你遇到事件循環時,它會自動釋放並消失。

你應該做的事情像這個tempArray

-(void)whereverThisIs { 
    // Do not retain here if connectSeriesJSonBack returns a retained instance 
    tempArray = [[connect connectSeriesJSonBack] retain]; 
} 

-(void)dealloc { 
    [tempArray release]; 
} 

-(void)anotherMethod { 
    if (tempArray) { // Do things } 
} 
+1

真的很好解釋好答案謝謝Dre – NevzatR 2011-03-10 10:15:40

0

如果您從函數[connect connectSeriesJSonBack];返回的自動釋放數組比您的tempArrayviewDidLoad方法後的返回計數爲0。

有2個方法是如何使它工作

1)使用NSMutableArray對象並添加對象

tempArray = [[NSMutableArray alloc] init]; 
[tempArray addObjectsFromArray:[connect connectSeriesJSonBack]]; 

2)保留在返回的數組

tempArray = [[connect connectSeriesJSonBack] retain];