Iphone NSArray生命周期

Iphone NSArray生命周期,iphone,objective-c,ios,nsarray,Iphone,Objective C,Ios,Nsarray,我在.h文件中创建了一个NSArray对象: NSArray *tempArray; 然后我在viewDidLoad方法的.m文件中分配它: tempArray = [[NSArray alloc] init]; //initilaize tempArray = [connect connectSeriesJSonBack]; //fill it (I try it works) 但我想在另一种方法中使用此数组,如: - (void)scrollViewDidEndDecelerat

我在.h文件中创建了一个NSArray对象:

NSArray *tempArray;
然后我在viewDidLoad方法的.m文件中分配它:

tempArray = [[NSArray alloc] init]; //initilaize
tempArray = [connect connectSeriesJSonBack]; //fill it (I try it works)
但我想在另一种方法中使用此数组,如:

    - (void)scrollViewDidEndDecelerating:(UIScrollView *)_scrollView 

我如何组织阵列生命周期,因为我使用alloc、retain等。无法再次访问阵列数据。

如果希望访问类中的同一阵列,则可以尝试将其作为类变量,以便在整个类中访问其成员

我建议在执行过程中像

@implementation YourViewController

NSMutableArray *mutableExample;
// or 
NSArray *example;
然后在-viewdidload中像mutableExample一样alloc=[[[NSMutableArray alloc]init]retain]; 或者只是示例=[[NSArray alloc]init]

而且你可以在任何地方使用它。别忘了发布它

如果有不清楚的地方,希望能有所帮助,在评论中提问


wblade

不要在方法中释放数组,而是在dealoc方法中释放它-这样您就可以在其他地方使用它

否则,这里还有另一个问题

这里创建一个保留的、空的、不可变的NSArray

现在你覆盖了指向那个保留实例的指针,耶,你刚刚泄露了一个NSArray

tempArray = [connect connectSeriesJSonBack];
该方法应该返回一个自动删除的NSArray。一旦你点击一个事件循环,它会自动释放并消失

你应该这样做

-(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 }
 }

您对tempArray的第二次分配将产生内存泄漏,因为无法再次访问该分配。connectSeriesJSonBAck可能会返回自动删除的NSArray。如果要在当前范围之外继续引用它,则应保留它:

而不是:

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


并在类的dealloc方法中添加[tempArray release]。

如果从函数[connect connectSeriesJSonBack]返回自动释放的数组;在viewDidLoad方法之后,tempArray的返回计数将为0

有两种方法可以让它工作

1使用NSMutableArray对象并添加对象

tempArray = [[NSMutableArray alloc] init];
[tempArray addObjectsFromArray:[connect connectSeriesJSonBack]];
2保留返回的数组

tempArray = [[connect connectSeriesJSonBack] retain];

同一类中的另一个方法?是的,mihir是同一个类,我不明白为什么我不能访问数组的数据?如果你在.h文件中创建了tempArray。。。然后您应该直接访问该类中的tempArray。。。不需要做任何事。。。。除非您在访问它之前发布它,否则术语是instance variable或ivarThank you Diederik,它是有效的。我应该阅读内存管理教程。但你能马上告诉我吗?为什么我不能分配、初始化这个对象并保留它?你问Diederik,但也许我可以给你答案,因为你从[connect connectSeriesJSonBack]得到的;是一个alloced nsarray。您只需保留它。[connect connectSeriesJSonBack]不知道您将它分配给什么-doing[[nsarray alloc]init]创建一个全新的对象,然后[connect connectSeriesJSonBack]做同样的事情-浪费一个对象。对于其他问题,请阅读
tempArray = [[NSMutableArray alloc] init];
[tempArray addObjectsFromArray:[connect connectSeriesJSonBack]];
tempArray = [[connect connectSeriesJSonBack] retain];