在obj-c中释放NSMutablearray

时间:2010-08-16 06:17:41

标签: iphone

在哪里释放/释放我的NS-mutable数组a1 ??

看到这个

- (void)viewDidLoad {

[NSThread detachNewThreadSelector:@selector(loadImage) toTarget:self withObject:nil];


}

- (void) loadImage
{

    NSLog(@" THREAD METHOD");





    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];  


    NSUserDefaults *imgg = [NSUserDefaults standardUserDefaults];
    myimg= [imgg stringForKey:@"keyToimg"];
    NSLog(@"RES image sssssssss  is = %@",myimg);

    a1 = [[NSMutableArray alloc] init];
    [a1 addObjectsFromArray:[myimg componentsSeparatedByString:@"\n\t"]];



    //[a1 removeAllObjects];
    //// 
    //[myimg release];
    [pool release];


}

并且在第3部分的表格单元格中显示图像

switch(indexPath.section)
{

                                    NSString *urlE=[a1 objectAtIndex:1];
            NSLog(@"url is %@",urlE);

            NSData *backgroundData = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlE]]; 


            image = [UIImage imageWithData:backgroundData];
            myImageView= [[UIImageView alloc] initWithImage:image];
            [myImageView setUserInteractionEnabled:YES]; 

            CGRect rect=CGRectMake(20 ,10, 270, 180);

            myImageView.frame = rect;
            myImageView.tag = i;    
                    [cell.contentView addSubview:myImageView];

}

并且基于点击图片正在改变

pragma mark working image tap

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    NSLog(@" life count %d",[myimg retainCount]);

    NSLog(@" life  array count %d",[a1 retainCount]);     

    //NSLog(@" GITSHffffffffffffffffffffffffffffffC");
    NSUInteger sections = [indexPath section]; 
    //NSLog(@"row is %d",sections);
    if (sections  == 3)
    { //Its either 1 or 0 I don't remember, it's been a while since I did some tableview  
        if(tap<[a1 count]-1) {
            NSLog(@" life  array count %d",[a1 retainCount]);     
            tap++;

            NSString *sa=[a1 objectAtIndex:tap];
        //////////////////////
            image= [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat: sa,[a1 objectAtIndex:tap ]]]]];


            NSData *imageData = [NSData dataWithData:UIImageJPEGRepresentation(image, 1.0)]; 


            myImageView.image = image;
            //[myimg release];
            //[a1 release];

        }
        else {
            tap=1;
            //[myimg release];
            //[a1 release];
        }



        }



        //[a1 release];


}   

那么我应该在哪里发布 my a1和myimg

2 个答案:

答案 0 :(得分:1)

而不是:

a1 = [[NSMutableArray alloc] init];
[a1 addObjectsFromArray:[myimg componentsSeparatedByString:@"\n\t"]];

考虑:

a1 = [NSMutableArray arrayWithArray:[myimg componentsSeparatedByString:@"\n\t"]];

这将使用自动释放的NSMutableArray对象初始化你的a1,然后你不必担心手动释放它。

我不知道的是你的[pool release]是否会释放它,但是......我真的更喜欢你不把这个行业放在后台线程中,而是使用异步网络方法来获取你的图像数据。

顺便说一句,在我学习iPhone开发的过程中,我经历了三到四个关于后台网络的“aha时刻”。其中一个与在后台线程上运行选择器有关。这持续了大约一个星期,直到我发现了ASIHttpRequest,这就是我现在的做法。将网络交互放在后台更简单的方法,而不必弄乱线程或任何废话。见http://allseeing-i.com/ASIHTTPRequest/

如果你查看我的答案,每次HTTP客户端网络出现时我都推荐ASI。我真的不是故意为它做点什么 - 它让我的生活变得如此简单,我认为每个人都需要了解它。

答案 1 :(得分:0)

永远不会使用此代码发布a1。 你应该把它放在一个成员变量上,或者在init之后添加autorelease。

顺便说一下,将myImageView添加到单元格视图后,应该将其释放。 这可能是因为保留/释放逻辑:当你分配myImageView时,保留计数为+1,一旦你将它添加到单元格视图,它现在是+2,你应该释放它,以便保留返回到+ 1然后当进一步释放单元格视图时,它会将保留计数减少到0。

最后一个函数

中变量图像的逻辑相同

此致 Meir assayag