NSArray生命周期

时间:2011-03-10 09:52:51

标签: 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)scrollViewDidEndDecelerating:(UIScrollView *)_scrollView 

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

5 个答案:

答案 0 :(得分:3)

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

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

在这里,您可以创建一个保留的空不可变 NSArray

tempArray = [[NSArray alloc] init];

现在你覆盖指向该保留实例的指针,但是,你刚刚泄露了一个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 }
 }

答案 1 :(得分:2)

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

而不是:

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

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

并在您的班级“[tempArray release]方法”中添加dealloc

答案 2 :(得分:0)

如果要访问类中的相同数组,则可以尝试将其设置为类变量,以便可以在整个类中访问其成员。

答案 3 :(得分:0)

我建议在实现中声明它,如

@implementation YourViewController

NSMutableArray *mutableExample;
// or 
NSArray *example;

然后在-()viewdidload中将其分配为mutableExample = [[[NSMutableArray alloc] init]retain]; 或只是example = [[NSArray alloc] init];

你可以在每个地方使用它。不要忘记释放它!!!

希望如果有什么不清楚会有帮助在评论中提出它

wblade

答案 4 :(得分:0)

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

如何使其发挥作用有两种方法

1)使用NSMutableArray对象并添加对象

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

2)保留返回的数组

tempArray = [[connect connectSeriesJSonBack] retain];