2011-03-10 71 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];